映射外键以及NHibernate中的引用,而无需创建额外的列

时间:2012-09-15 18:26:01

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

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

 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()指令总是创建一个额外的列。

2 个答案:

答案 0 :(得分:4)

你没有在NHibernate中两次映射相同的关系。

只是:

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

然后你用它来获得FK值:

var parentId = obj.Parent.Id;

或者这个分配它:

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

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

答案 1 :(得分:3)

事实证明,映射我展示的方式非常好。额外字段的问题是由关系的另一方创建的。我所拥有的是:

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();