流畅的 NHibernate HASMANY 映射,无需参考
Posted
技术标签:
【中文标题】流畅的 NHibernate HASMANY 映射,无需参考【英文标题】:Fluent NHibernate HASMANY mapping without references 【发布时间】:2015-07-12 05:41:48 【问题描述】:我是使用 Fluent NHibernate 的初学者。 我正在开发一个必须与现有数据库交互的 C# 应用程序。假设我有 2 个表:Items 和 ItemsList。
Items: ID INT ItemName VARCHAR(100)
ItemsList: ID INT ChildItemID INT
我已经构建了 2 个类及其映射:
public class Items
public virtual int id get; set;
public virtual string itemName get; set;
public class ItemsMap : ClassMap<Items>
public ItemsMap()
Id(x => x.id).GeneratedBy.Increment();
Map(x => x.itemsName);
public class ItemsList()
public virtual int id get; set;
public virtual IList<Items> childItems get; set;
public ItemsList()
childItems = new List<Items>();
public class ItemsListMap : ClassMap<ItemsList>
public ItemsListMap()
Id(x => x.id).GeneratedBy.Increment();
HasMany(x => x.childItems).KeyColumn("childID").Cascade.All();
最后,我在 itemsList 中插入一个项目并将其全部保存:
try
using( ISession session = NH.OpenSession())
using(ITransaction transaction = session.BeginTransaction())
Items i = New Items()
i = session.get<Items>(1);
ItemsList il = new ItemsList();
il.childID.Add(i);
session.SaveOrUpdate(il);
transaction.Commit();
所以当我提交时,我在 ItemsList 表中有一个新条目,但 childID 是空白的。
问题:
我看到的所有示例都引用了 Items 表中的 ItemsListID。但我不想有这个参考,因为我希望项目在项目表中是唯一的。我怎样才能做到这一点?
【问题讨论】:
【参考方案1】:表达唯一引用的 NHibernate 原生方式是:
5.1.12. one-to-one
有两种类型的一对一关联:
主键关联 唯一的外键关联主键关联不需要额外的表列;如果两行通过关联关联,则这两个表行共享相同的主键值。因此,如果您希望两个对象通过主键关联关联,则必须确保为它们分配相同的标识符值!...
换句话说,表格看起来像这样(表格Items
生成ItemID
的值,表格ItemsList
获取该值并将其存储在ItemID
中) :
Items: ItemID INT ItemName VARCHAR(100)
ItemsList: ItemID INT
C# 将是 (我将 Items 更改为 Item
,将 ItemList 更改为 ItemMoreDetails
,因为它不再是列表)
public class Item
public virtual int ItemId get; set;
...
public virtual ItemMoreDetails ItemMoreDetails get; set;
public class ItemMoreDetails
public virtual int ItemId get; set;
...
public virtual Item Item get; set;
映射将是(流利的):
// Parent side
public class ItemMap : ClassMap<Item>
public ItemMap()
Id(x => x.id).GeneratedBy.Increment();
...
HasOne(x => x.ItemMoreDetails).Cascade.All();
// child side
public class ItemMoreDetailsMap: ClassMap<ItemMoreDetails>
public ItemMoreDetailsMap()
...
References(x => x.parent).Unique();
查看文档:
HasOne / one-to-one
【讨论】:
以上是关于流畅的 NHibernate HASMANY 映射,无需参考的主要内容,如果未能解决你的问题,请参考以下文章
Fluent NHibernate 实体 HasMany 不同子类类型的集合