【问题标题】:Fluent NHibernate CompositeId trying to insert null values流利的 NHibernate CompositeId 尝试插入空值
【发布时间】:2013-09-16 10:27:43
【问题描述】:

我正在使用 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);
    }
}

【问题讨论】:

  • ItemInGroup.Item/ItemGroup 是否正确初始化? DisplayOrder 是链接表中唯一的属性吗?

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多