簡體   English   中英

流利的NHibernate多對多映射自引用和關聯表

[英]Fluent NHibernate Many-to-Many Mapping Self Referencing with associative table

僅作記錄:我使用C#,Fluent NHibernate和MySQL 5。

我曾經在這個項目中使用NHibernate,但是最近我決定使用Fluent NHibernate。 我在用額外的列映射引用自身的多對多關系時遇到問題。

我有表Item Item可以有很多組件,這些組件也來自表Item 這些組件也可以由其他項目使用。 例如,項目A需要兩個組件,分別是項目B和項目C。項目B也用於項目D和項目E,依此類推。

我使用了關聯表,我需要用於它們之間關系的其他列。 因此,將有2個一對多關系。 這是我的數據庫結構。

  1. 項目
    • ID
    • 名稱
  2. 前提條件[關聯表]
    • ID
    • Item_ID [FK_Item1] //要制造的物品。
    • Component_ID [FK_Item2] //此項目的組件。
    • 權重//附加列。

這是我對先決條件表的映射:

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);
}

這是我對Item表的映射:

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);
}

這是我的前提課程:

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; }

這是我的物品類別:

// 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; }

我的問題是,每當我嘗試使用先決條件保存/更新Item時,Component_ID和Item_ID始終具有相同的值。 我在先決條件表中創建了新的X項,其中包含Y項和Z項,它們是:

ID | Item_ID | Component_ID |需要

1 | X | X | 10

2 | X | X | 20

而不是預期的結果

1 | X | Y | 10

2 | X | 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());
            }

        }

    }

這可能是什么問題? 是因為我引用了同一張表嗎? 還是我映射錯誤?

我閱讀了其他類似的問題,從產品到產品以及 許多到很多自引用,但似乎他們沒有在關聯表中使用其他列?

非常感謝您的任何幫助,謝謝。

愚蠢的我..我為項目使用了錯誤的參考。

我將item.PrerequisiteComponent更改為item.PrerequisiteParent ,一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM