没有引用的 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 本机方法是:

5.1.12. one-to-one

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