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