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.