我正在使用Fluent NHibernate映射现有数据库,并且在涉及复杂的多对多关系(附加列)时遇到了问题。
我知道与其他列的多对多关系必须映射为HasMany
而不是HasManyToMany
,因为它们不是纯粹的多对多关系。链接表必须作为一个类本身映射,我在下面的例子中做了。
从现有数据库加载此数据时,它可以正常加载。我正在处理的项目获取此数据并将其插入到空数据库中,这是出现问题的地方。我认为,当插入新数据库时,CompositeId
正在尝试插入NULL
和ItemID
的{{1}}值,这在数据库中是不允许的。此时更改数据库结构不是一个可行的选择,有没有办法绕过这个问题?
谢谢,下面的示例代码。
ItemGroupID
public class Item
{
public virtual long ItemID { get; set; }
public virtual string Name { get; set; }
}
public class ItemGroup
{
public virtual long ItemGroupID { get; set; }
public virtual string Name { get; set; }
public virtual IList<ItemInGroup> ItemsInGroup { get; set; }
}
public class ItemInGroup
{
public virtual Item Item { get; set; }
public virtual ItemGroup ItemGroup { get; set; }
public virtual int? DisplayOrder { get; set; }
}
答案 0 :(得分:0)
假设DisplayOrder是链接表中唯一的额外列,为什么不使用IList的List索引作为订单?
public class ItemGroup
{
public virtual long ItemGroupID { get; set; }
public virtual string Name { get; set; }
public virtual IList<Item> Items { get; private set; }
}
public class ItemGroupMap : ClassMap<ItemGroup>
{
public ItemGroupMap()
{
Table("ItemGroups");
Id(x => x.ItemGroupID).GeneratedBy.Identity();
Map(x => x.Name);
HasManyToMany(x => x.ItemsInGroup)
.Table("ItemsInGroups")
.ParentKeyColumn("ItemGroupID")
.ChildKeyColumn("ItemID")
.AsList("DisplayOrder")
.Cascade.All();
}
}