Fluent NHibernate CompositeId 试图插入空值
本文关键字:插入 空值 NHibernate CompositeId Fluent | 更新日期: 2023-09-27 18:31:23
我正在努力使用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);
}
}
假设 DisplayOrder 是链接表中唯一额外的列,为什么不使用 IList 的列表索引作为顺序?
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();
}
}