I use NHibernate with Fluent and Envers.
I have an auditable class Hardware, which contains the property Settings, 
which is mapped to a collection entity.

Error:
The created audit table adds also the value column (SettingValue) to the 
primary key, which fails in this case (SqlCeException: Long value data type 
cannot be indexed.)

Expected:
The value column SettingValue should not be part of the primary key.


*/* definition of Setting (in class Hardware) */*
    public virtual IDictionary<string, string> Settings
    {
        get { return _settings; }
        set { _settings = value; }
    }

*/* automapping override with fluent */*
    mapping.HasMany(x => x.Settings)
        .Not.LazyLoad()
        .AsMap<string>("SettingName")
        .KeyColumns.Add("HardwareSettings_id")
        .Table("HardwareSettings")
        .Element("SettingValue", x => x.Type<StringClobUserType>());

*/* trace of the resulting Hardware mapping (containing map 
HardwareSettings) */*
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class xmlns="urn:nhibernate-mapping-2.2" 
name="MyApp.Data.Model.Hardware.Hardware, MyApp.Data.Model, 
Version=1.0.0.0, Culture=neutral, PublicKeyToken=866d4a0fa0599fe0" 
table="`Hardware`">
        <cache usage="read-write" />
        <id name="Id" type="System.Guid, mscorlib, Version=4.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089">
            <column name="Id" />
            <generator class="guid.comb" />
        </id>
        <map cascade="save-update" lazy="false" name="Settings" 
table="HardwareSettings">
            <cache usage="read-write" />
            <key>
                <column name="HardwareSettings_id" />
            </key>
            <index type="System.String, mscorlib, Version=4.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089">
                <column name="SettingName" />
            </index>
            <element 
type="MyApp.DataAccess.NHibernate.UserTypes.StringClobUserType, 
MyApp.DataAccess.NHibernate, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=866d4a0fa0599fe0">
                <column name="SettingValue" />
            </element>
        </map>

        <!-- several other properties and subclasses --> 

    </class>
</hibernate-mapping>

*/* trace of the resulting HardwareSettings autition table mapping */*
<hibernate-mapping assembly="NHibernate.Envers" auto-import="false" 
xmlns="urn:nhibernate-mapping-2.2">
  <class entity-name="HardwareSettings_AUD" table="HardwareSettings_AUD">
    <composite-id name="originalId">
      <key-many-to-one class="NHibernate.Envers.DefaultRevisionEntity, 
NHibernate.Envers, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=e2c5b946037fb7f8" name="REV">
        <column name="REV" />
      </key-many-to-one>
      <key-property name="Hardware_Id" type="Guid">
        <column name="HardwareSettings_id" />
      </key-property>
      <key-property name="element" 
type="MyApp.DataAccess.NHibernate.UserTypes.StringClobUserType, 
MyApp.DataAccess.NHibernate, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=866d4a0fa0599fe0">
        <column name="SettingValue" />
        <type 
name="MyApp.DataAccess.NHibernate.UserTypes.StringClobUserType, 
MyApp.DataAccess.NHibernate, Version=1.0.0.0, Culture=neutral, 
PublicKeyToken=866d4a0fa0599fe0" />
      </key-property>
      <key-property name="mapkey" type="String">
        <column name="SettingName" />
      </key-property>
    </composite-id>
    <property insert="true" update="false" name="REVTYPE" 
type="NHibernate.Envers.Entities.RevisionTypeType, NHibernate.Envers, 
Version=1.0.0.0, Culture=neutral, PublicKeyToken=e2c5b946037fb7f8" 
not-null="true" />
  </class>
</hibernate-mapping>


*/* created HardwareSettings table */*
    create table HardwareSettings (
        HardwareSettings_id UNIQUEIDENTIFIER not null,
       SettingValue NTEXT null,
       SettingName NVARCHAR(255) not null,
       primary key (HardwareSettings_id, SettingName)
    )

*/* created HardwareSettings audition table (with erroneous primary key) */*
    create table HardwareSettings_AUD (
        REV INT not null,
       HardwareSettings_id UNIQUEIDENTIFIER not null,
       SettingValue NTEXT not null,
       SettingName NVARCHAR(255) not null,
       REVTYPE TINYINT not null,
       primary key (REV, HardwareSettings_id, SettingValue, SettingName)
    )


If this cannot be solved by myself or via configuration:
Has someone an idea where to hook in to change the way Envers creates the 
schema for the audit tables?




-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/d/optout.

Reply via email to