流畅的NHibernate:一对一映射 - 从主列反向到外键

时间:2014-09-11 03:25:26

标签: c# nhibernate fluent-nhibernate

我有一个" Group" class and a" GroupSummaryLevel"类,代码如下。 DB中的这些实体之间存在一对一的关系。我需要" GroupSummaryLevel"作为Groups类中的属性。它应该是一个非常简单的连接,如

(SELECT g.Id FROM GroupSummaryLevel g WHERE g.AcctGroup = GroupID)

不幸的是,我无法弄清楚如何处理NHibernate。我在这里看到的许多答案对我没有帮助。我会从那些经验丰富的NHibernate用户那里获得任何意见。提前谢谢。

public class Group : DomainEntity
{
    public virtual string GroupId { get; set; }
    public virtual string GroupName { get; set; }
    public virtual GroupSummaryLevel GroupSummaryLevel { get; set; }
}

public class GroupSummaryLevel : DomainEntity
{
    public virtual int Id { get; set; }
    public virtual string AcctGroup { get; set; }
    public virtual GroupSummaryLevel Parent { get; set; }
    public virtual IList<GroupSummaryLevel> Children { get; set; }

    public GroupSummaryLevel()
    {
        Children = new List<GroupSummaryLevel>();
    }
}

到目前为止,我所做的映射并没有奏效。我的映射代码如下:

    public GroupMap()
    {
        Table("Groups");
        LazyLoad();
        Id(x => x.GroupId).GeneratedBy.Assigned().Column("GroupID").CustomType<TrimmedString>();
        Map(x => x.GroupName).Column("GroupName").CustomType<TrimmedString>().Not.Nullable();

        HasOne(x => x.GroupSummaryLevel).Cascade.None().ForeignKey("AcctGroup");
    }
    public GroupSummaryLevelMap()
    {
        Table("GroupSummaryLevel");
        LazyLoad();
        Id(x => x.Id).GeneratedBy.Identity().Column("Id");
        Map(x => x.AcctGroup).Column("AcctGroup").CustomType<TrimmedString>().Not.Nullable();

        //References(x => x.Parent).Column("ParentId");
        //HasMany(x => x.Children).Cascade.All().KeyColumn("ParentId");
    }

注意:我还需要为GroupSummaryLevel进行自我加入,并且也没有成功。对此的任何建议也将受到赞赏:)

1 个答案:

答案 0 :(得分:1)

我想说,您的one-to-one不是由主要/外国键驱动,而是由property-ref驱动。因此,该集团应通过这样的方式来描述摘要:

  

...如果您想查找相关的SummaryLevel,请将我的<id>传递到映射为AcctGroup的列

public GroupMap()
{
    ...
    HasOne(x => x.GroupSummaryLevel)
        .Cascade.None()
        //.ForeignKey("AcctGroup")
        .PropertyRef(gsl => gsl.AcctGroup)
        ;
}
public GroupSummaryLevelMap()
{
    ...
    //References(x => x.Parent).Column("ParentId");
    //HasMany(x => x.Children).Cascade.All().KeyColumn("ParentId");
    References(x => x.Parent, "AcctGroup");
}

完整性的注释,如评论中所述:

在这种情况下,当“child”引用了parent时 - 它确实需要one-to-many / .HasMany()映射。

不利的一面是,该孩子被表示为儿童的集体:IList<GroupSummaryLevel>。使用它并不简单,但我们可以创建一些虚拟属性,返回.FirstOrDefault()。我们获得的好处是延迟加载(与一对一不一致)