没有引用的 Fluent NHibernate HASMANY 映射
Fluent NHibernate HASMANY mapping without references
我是 Fluent NHibernate 的初学者。
我正在开发一个 C# 应用程序,它必须与现有的 database.Let 交互,假设我有 2 个 table: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 table 中有一个新条目,但是 childID 是空白的。
问题:
我看到的所有示例都引用了 Items table 中的 ItemsListID。但我不想有这个参考,因为我希望该项目在项目 table 中是唯一的。我怎样才能做到这一点?
表示唯一引用的 NHibernate 本机方法是:
There are two varieties of one-to-one association:
- primary key associations
- unique foreign key associations
Primary key associations don't need an extra table column; if two rows are related by the association then the two table rows share the same primary key value. So if you want two objects to be related by a primary key association, you must make sure that they are assigned the same identifier value!...
换句话说,Tables 看起来像这样 (Table Items
生成 value ItemID
, table 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
我是 Fluent NHibernate 的初学者。 我正在开发一个 C# 应用程序,它必须与现有的 database.Let 交互,假设我有 2 个 table: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 table 中有一个新条目,但是 childID 是空白的。
问题:
我看到的所有示例都引用了 Items table 中的 ItemsListID。但我不想有这个参考,因为我希望该项目在项目 table 中是唯一的。我怎样才能做到这一点?
表示唯一引用的 NHibernate 本机方法是:
There are two varieties of one-to-one association:
- primary key associations
- unique foreign key associations
Primary key associations don't need an extra table column; if two rows are related by the association then the two table rows share the same primary key value. So if you want two objects to be related by a primary key association, you must make sure that they are assigned the same identifier value!...
换句话说,Tables 看起来像这样 (Table Items
生成 value ItemID
, table 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();
查看文档: