【问题标题】:Fluent NHibernate HASMANY mapping without references流畅的 NHibernate HASMANY 映射,无需参考
【发布时间】: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。但我不想有这个参考,因为我希望项目在项目表中是唯一的。我怎样才能做到这一点?

【问题讨论】:

    标签: nhibernate fluent-nhibernate mapping nhibernate-mapping fluent-nhibernate-mapping


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2010-11-22
      • 1970-01-01
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多