念のために:私は流暢NHibernateのは、多対多マッピング自己参照連想テーブルと
C#、流暢NHibernateは、とMySQL 5を使用して、私はこのプロジェクトのためにNHibernateはを使用するために使用されるが、最近私が使用することを決めました代わりに流暢NHibernate。そして、私は、列を追加して自己を参照する多対多の関係をマッピングする際に問題があります。
私はテーブルアイテムを持っています。アイテムはテーブルからも多くのコンポーネントを持ちます。アイテムです。これらのコンポーネントは他のアイテムでも使用できます。 たとえば、アイテムAには、アイテムBとアイテムCの2つのコンポーネントが必要です。アイテムBは、アイテムDとアイテムEなどにも使用されます。
私は結合表を使用しました。私はそれらの関係のために追加の列が必要です。そのため、2つの1対多関係があります。これは私のデータベース構造です。
- 項目
- ID
- 名
- 前提[連想テーブル]
- 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; }
そして、この私のアイテムクラスです:私が持っている問題は、私は前提条件でアイテムを更新/保存しようとするたびに、COMPONENT_IDとITEM_IDは常に同じ値を持ち、ある
// 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_ID | | COMPONENT_ID | が必要
ID |:私はコンポーネントアイテムYとZ項目で、新しい項目Xを作成し、前提条件の表に、私は、これらが得ました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 productとmany to many self referencingを読んでいましたが、彼らは彼らの結合テーブルに追加の列を使用していないようですね?
ご協力いただきありがとうございます、ありがとうございます。