Fluent NHibernate CompositeId尝试插入空值

时间:2013-09-16 10:27:43

标签: c# nhibernate fluent-nhibernate fluent composite-id

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

我知道与其他列的多对多关系必须映射为HasMany而不是HasManyToMany,因为它们不是纯粹的多对多关系。链接表必须作为一个类本身映射,我在下面的例子中做了。

从现有数据库加载此数据时,它可以正常加载。我正在处理的项目获取此数据并将其插入到空数据库中,这是出现问题的地方。我认为,当插入新数据库时,CompositeId正在尝试插入NULLItemID的{​​{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; }
}

1 个答案:

答案 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();
    }
}