【问题标题】:Map foreign key as well as reference in NHibernate without creating extra column在 NHibernate 中映射外键和引用而不创建额外的列
【发布时间】:2012-09-17 17:20:59
【问题描述】:

我想将两个外键映射为 POCO 属性导航属性。示例中的 IE here ,答案替换为外键

 public virtual int SongArtistID { get; set; }

我想将该键保留在映射中。到目前为止我已经尝试过:

Map(x => x.ParentID);
References(x => x.Parent).Column("ParentID");

Map(x => x.ParentID);
References(x => x.Parent, "ParentID");

和许多其他使用流利映射器的组合,但我无法让它工作。问题是References() 指令总是创建一个额外的列。

【问题讨论】:

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


    【解决方案1】:

    您不会在 NHibernate 中两次映射相同的关系。

    只是:

    References(x => x.Parent, "ParentID")
    

    然后你用它来获取 FK 值:

    var parentId = obj.Parent.Id;
    

    或者这个来分配它:

    obj.Parent = session.Load<TheClassOfTheParent>(parentId);
    

    这些语句都不会导致 db 调用。

    【讨论】:

    • 我不想映射关系两次,我只想将属性作为一个简单的(例如 int)属性访问,而不需要任何 ORM、会话等知识,只是数据模型跨度>
    • 好吧,这行不通。 NHibernate 面向基于关系的对象模型,而不是基于外键的 DB 模型。
    • 其实可以的,问题不在Reference()看我的回复
    • 感谢您的回复和关注!
    • 我不同意@DiegoMijelshon,在这里查看我的回答stackoverflow.com/a/37436232/173073
    【解决方案2】:

    事实证明,按照我展示的方式绘制地图非常好。额外字段的问题是由关系的另一方造成的。我所拥有的是:

    class ParentMap
    
            HasMany(x => x.Children)
                .Inverse()
                .Cascade.All();
    
    class ChildMap
    
            Map(x => x.ParentID);
            References(x => x.Parent).Column("ParentID");
    

    我必须在父级的 HasMany() 上指定列,而不是在子级的 Reference() 上指定列,如下所示:

    class ParentMap
    
            HasMany(x => x.Children)
                .KeyColumn("ParentID") // Problem without this!
                .Inverse()
                .Cascade.All();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 2014-05-26
      相关资源
      最近更新 更多