我有一个" 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进行自我加入,并且也没有成功。对此的任何建议也将受到赞赏:)
答案 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()
。我们获得的好处是延迟加载(与一对一不一致)。