C# Fluent NHibernate:一对一映射-从主列反向映射到外键

C# Fluent NHibernate:一对一映射-从主列反向映射到外键,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有一个Group类和一个GroupSummaryLevel类,下面给出了代码。DB中的这些实体之间存在一对一的关系。我需要GroupSummaryLevel作为Groups类中的属性。它应该是一个非常简单的连接,就像 从GroupSummaryLevel g中选择g.Id,其中g.AcctGroup=GroupID 不幸的是,我没能弄明白如何处理NHibernate。我在这里看到的许多答案对我毫无帮助。我会通知更多经验丰富的NHibernate用户的任何意见。提前谢谢 public class

我有一个Group类和一个GroupSummaryLevel类,下面给出了代码。DB中的这些实体之间存在一对一的关系。我需要GroupSummaryLevel作为Groups类中的属性。它应该是一个非常简单的连接,就像

从GroupSummaryLevel g中选择g.Id,其中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做一个自连接,但也没有成功。对此的任何建议也将不胜感激:

我想说的是,您的一对一不是由主键/外键驱动的,而是由property-ref驱动的。因此,小组应该通过这样的方式绘制摘要:

…如果要查找相关的SummaryLevel,请将my传递到映射为AcctGroup的列中

注释中讨论的完整性注释:

在这个场景中,当子对象引用父对象时,它实际上需要一对多/.HasMany映射


不利的一面是,这个孩子被描述为一个孩子的集合:IList。虽然使用起来不太方便,但我们可以创建一些虚拟财产,返回.FirstOrDefault。我们得到的好处是一对一的延迟加载不到位。

我在按照您的建议更改后出现了以下错误:在已经添加的情况下,尝试向一个“父级”添加多个。我一定错过了什么。所以GroupSummarLevel中的引用可能会导致这种情况?这里最合理的映射不是一对一。在你的情况下,这似乎不是一对一,而是一对多。因为如果我读得好的话,同一个acttgroup可能会有更多的GroupSummaryLevel。所以我会把小组改成收集摘要。。。一对多。您可以将虚拟财产放在上面,使用SummaryLevel。首先。。。这对我来说是有意义的,诚实的好决定,如果不是伟大的;它确实有一些问题。。。但最后。。。我在这种情况下使用相同的方法。对你最大的好处是:它将是NHibernate的本土产品。。。你将获得所有积极的东西;但是它是一对多;享受NHibernate Hibernate一定很好,我的同事和主管对此非常兴奋,我们才刚刚开始使用它。作为这方面的初学者,我觉得这有点复杂,但希望能达到目标。再次感谢。
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");
}