Fluent NHibernate 多对多映射自引用与关联 table

Fluent NHibernate Many-to-Many Mapping Self Referencing with associative table

仅作记录:我使用 C#、Fluent NHibernate 和 MySQL 5.

我以前在这个项目中使用 NHibernate,但最近我决定改用 Fluent NHibernate。我在映射引用自身的多对多关系时遇到了问题。

我有table。 Item can 有很多组件也来自 table Item。这些组件也可以被其他项目使用。 比如Item A需要两个组件,Item B和Item C。Item B也用于Item D和Item E,依此类推。

我使用了关联 table 并且我需要额外的列来表示它们的关系。因此,将有 2 个一-多关系。这是我的数据库结构。

  1. 项目
    • ID
    • 姓名
  2. 先决条件[关联table]
    • ID
    • Item_ID [FK_Item1 ] // 要制作的项目。
    • Component_ID [FK_Item2 ] // 此项的组成部分。
    • 权重//附加列。

这是我对先决条件 Table 的映射:

public PrerequisiteMap()
{
    Id(x => x.ID).GeneratedBy.Native();

    References(x => x.Item).Column("Item_ID");
    References(x => x.Component).Column("Component_ID");

    Map(x => x.Need);
}

这是我对项目 table 的映射:

public ItemMap()
{
    Id(x => x.ID).GeneratedBy.Native();

    HasMany(x => x.PrerequisitesParent).KeyColumn("Item_ID").Cascade.All();
    HasMany(x => x.PrerequisitesComponent).KeyColumn("Component_ID").Cascade.All ;

    Map(x => x.Name);
}

这是我的先决条件 class :

public virtual UInt64 ID { get; set; }
// item.
public virtual UInt64 Item_ID { get; set; }
public virtual Item Item { get; set; }
// Component.
public virtual UInt64 Component_ID { get; set; }
public virtual Item Component { get; set; }

// prerequisite properties.
public virtual float Need { get; set; }

这是我的商品 class :

// Item properties.
public virtual UInt64 ID { get; protected set; }
public virtual string Name { get; set; }
public virtual IList<Prerequisite> PrerequisitesComponent { get; set; }
public virtual IList<Prerequisite> PrerequisitesParent { get; set; }

我遇到的问题是,每当我尝试 save/update 具有先决条件的项目时,Component_ID 和 Item_ID 总是具有相同的值。我在先决条件 table 中创建了新的项目 X,其中包含组件项目 Y 和项目 Z,我得到了这些:

ID|Item_ID|Component_ID|需要

1 | × | × | 10

2 | × | × | 20

而不是预期的结果

1 | × |是 | 10

2 | × | Z | 20

这是我保存时的一段代码:

    using (var session = SessionFactoryProvider.OpenSession())
    {
        using (var trans = session.BeginTransaction())
        {
            var item = session.Get<Item>((UInt64)1); // Item to be updated.
            var item2 = session.Get<Item>((UInt64)2); // Component 1
            var item3 = session.Get<Item>((UInt64)3); // Component 2

            item.PrerequisitesComponent.Add(new Prerequisite() { Item = item, Component = item2, Need = 100f}); // adding new prerequisite from component 1 (item2)
            item.PrerequisitesComponent.Add(new Prerequisite() { Item = item, Component = item3, Need = 100f }); // adding new prerequisite from component 2 (item3)

            session.SaveOrUpdate(item);
            try
            {
                trans.Commit();
            }
            catch(GenericADOException ex)
            {
                MessageBox.Show(ex.InnerException.ToString());
            }

        }

    }

这可能是什么问题?是因为我引用了相同的 table 吗?还是我映射错了?

我读过其他类似的问题 many to many from product to product and many to many self referencing 但他们似乎没有在关联 table?

中使用额外的列

非常感谢任何帮助,谢谢。

愚蠢的我..我使用了错误的项目参考。

我将 item.PrerequisiteComponent 更改为 item.PrerequisiteParent,一切正常。