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 个一-多关系。这是我的数据库结构。
- 项目
- ID
- 姓名
- 先决条件[关联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
,一切正常。
仅作记录:我使用 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 个一-多关系。这是我的数据库结构。
- 项目
- ID
- 姓名
- 先决条件[关联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
,一切正常。