Fluent NHibernate CompositeId 试图插入空值

本文关键字:插入 空值 NHibernate CompositeId Fluent | 更新日期: 2023-09-27 18:31:23

我正在努力使用Fluent NHibernate映射现有数据库,并且在涉及复杂的多对多关系(附加列)时遇到了问题。

我知道具有附加列的多对多关系必须映射为HasMany而不是HasManyToMany因为它们不是纯粹的多对多关系。链接表必须作为自身内部的类进行映射,我在下面的示例中已经完成了此操作。

从现有数据库加载此数据时,它会加载正常。我正在处理的项目获取此数据并将其插入到空数据库中,这就是问题发生的地方。我认为在插入新数据库时,CompositeId 正在尝试插入数据库中不允许的ItemIDItemGroupID 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);
    }
}

Fluent NHibernate CompositeId 试图插入空值

假设 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();
    }
}