I am currently using NHibernate as my data access level, using Fluent NHibernate to create mapping files for me. I have two classes: TripItem and TripItemAttributeValue, which have a many-to-many relationship between them.
The display is as follows:
public class TripItemMap : ClassMap<TripItem2> { public TripItemMap() { WithTable("TripItemsInt"); NotLazyLoaded(); Id(x => x.ID).GeneratedBy.Identity().WithUnsavedValue(0); Map(x => x.CreateDate, "CreatedOn").CanNotBeNull(); Map(x => x.ModifyDate, "LastModified").CanNotBeNull(); HasManyToMany<TripItemAttributeValue>(x => x.Attributes).AsBag() .WithTableName("TripItems_TripItemAttributeValues_Link") .WithParentKeyColumn("TripItemId") .WithChildKeyColumn("TripItemAttributeValueId") .LazyLoad(); } } public class TripItemAttributeValueMap : ClassMap<TripItemAttributeValue> { public TripItemAttributeValueMap() { WithTable("TripItemAttributeValues"); Id(x => x.Id).GeneratedBy.Identity(); Map(x => x.Name).CanNotBeNull(); HasManyToMany<TripItem2>(x => x.TripItems).AsBag() .WithTableName("TripItems_TripItemAttributeValues_Link") .WithParentKeyColumn("TripItemAttributeValueId") .WithChildKeyColumn("TripItemId") .LazyLoad(); } }
At some point in my application, I retrieve existing attributes from the database, add them to tripItem.Attributes, and then save the tripItem object. In the end, TripItems_TripItemAttributeValues_Link never gets any new entries, as a result of which the relationship is not saved.
If this helps, these are the mapping files created by Fluent NHibernate for these classes:
<?xml version="1.0" encoding="utf-8"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="true" assembly="ETP.Core" namespace="ETP.Core.Domain"> <class name="TripItem2" table="TripItemsInt" xmlns="urn:nhibernate-mapping-2.2" lazy="false"> <id name="ID" column="ID" type="Int32" unsaved-value="0"> <generator class="identity" /> </id> <property name="CreateDate" column="CreatedOn" type="DateTime" not-null="true"> <column name="CreatedOn" /> </property> <property name="ModifyDate" column="LastModified" type="DateTime" not-null="true"> <column name="LastModified" /> </property> <bag name="Attributes" lazy="true" table="TripItems_TripItemAttributeValues_Link"> <key column="TripItemId" /> <many-to-many column="TripItemAttributeValueId" class="ETP.Core.Domain.TripItemAttributeValue, ETP.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </bag> </class> </hibernate-mapping>
and
<?xml version="1.0" encoding="utf-8"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="true" assembly="ETP.Core" namespace="ETP.Core.Domain"> <class name="TripItemAttributeValue" table="TripItemAttributeValues" xmlns="urn:nhibernate-mapping-2.2"> <id name="Id" column="Id" type="Int32"> <generator class="identity" /> </id> <property name="Name" column="Name" length="100" type="String" not-null="true"> <column name="Name" /> </property> <bag name="TripItems" lazy="true" table="TripItems_TripItemAttributeValues_Link"> <key column="TripItemAttributeValueId" /> <many-to-many column="TripItemId" class="ETP.Core.Domain.TripItem2, ETP.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> </bag> </class> </hibernate-mapping>
What am I doing wrong here?
efdee
source share