0

映射自參照只是爲了記錄:我使用C#,功能NHibernate和MySQL 5流利NHibernate的許多一對多與關聯表

我用NHibernate的這個項目,但最近我決定用流利的NHibernate代替。而且我在映射引用自身的多對多關係時遇到了問題並帶有附加列。

我有表項目。項目可以有許多組件也從表項目。這些組件也可以被其他項目使用。 例如,項目A需要兩個組件,分別是項目B和項目C.項目B還用於項目D和項目E,等等。

我用關聯表,我需要額外的列他們的關係。因此,將會有兩個一對多的關係。這是我的數據庫結構。

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

這是我的項目表映射:

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

我的問題是,每當我試圖保存前提/更新項目,將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()); 
      } 

     } 

    } 

什麼能在這裏是什麼問題?是因爲我引用同一張表嗎?或者我錯誤地映射了它?

我讀過其他類似的問題many to many from product to productmany to many self referencing但似乎他們沒有在其關聯表中使用額外的列?

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

回答

1

傻我..我用了錯誤的參考項目。

我將item.PrerequisiteComponent更改爲item.PrerequisiteParent並且一切正常。