【发布时间】:2013-09-16 10:27:43
【问题描述】:
我正在使用 Fluent NHibernate 映射现有数据库,但在涉及复杂的多对多关系(附加列)时遇到了问题。
我知道与附加列的多对多关系必须映射为HasMany 而不是HasManyToMany,因为它们不是纯粹的多对多关系。链接表必须映射为自身内部的一个类,我在下面的示例中已经完成了这一点。
从现有数据库加载此数据时,它可以正常加载。我正在处理的项目获取这些数据并将其插入到一个空数据库中,这就是问题发生的地方。我认为在插入新数据库时,CompositeId 正在尝试为ItemID 和ItemGroupID 插入NULL 值,这在数据库中是不允许的。在这一点上更改数据库结构不是一个可行的选择,有没有办法解决这个问题?
谢谢,下面的示例代码。
实体类
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; }
}
映射类
public class ItemMap : ClassMap<Item>
{
public ItemMap()
{
Table("Items");
Id(x => x.ItemID).GeneratedBy.Identity();
Map(x => x.Name);
}
}
public class ItemGroupMap : ClassMap<ItemGroup>
{
public ItemGroupMap()
{
Table("ItemGroups");
Id(x => x.ItemGroupID).GeneratedBy.Identity();
Map(x => x.Name);
HasMany(x => x.ItemsInGroup).KeyColumn("ItemGroupID").Cascade.All();
}
}
public class ItemInGroupMap : ClassMap<ItemInGroup>
{
public ItemInGroupMap()
{
Table("ItemsInGroups");
CompositeId().KeyReference(x => x.Item, "ItemID")
.KeyReference(x => x.ItemGroup, "ItemGroupID");
Map(x => x.DisplayOrder);
}
}
【问题讨论】:
-
ItemInGroup.Item/ItemGroup是否正确初始化? DisplayOrder 是链接表中唯一的属性吗?
标签: c# nhibernate fluent-nhibernate fluent composite-id