【问题标题】:Fluent NHibernate: One to One Mapping - reverse from primary column to a foreign keyFluent NHibernate:一对一映射 - 从主列反向到外键
【发布时间】:2014-09-11 23:01:53
【问题描述】:

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

(从 GroupSummaryLevel g WHERE g.AcctGroup = GroupID 中选择 g.Id)

不幸的是,我无法弄清楚如何使用 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 进行自加入,但也没有成功。对此的任何建议也将不胜感激:)

【问题讨论】:

    标签: c# nhibernate fluent-nhibernate


    【解决方案1】:

    我想说,您的 one-to-one 不是由 primary/foreign 键驱动的,而是由 property-ref 驱动的。所以小组应该这样说:

    ...如果您想找到相关的SummaryLevel,请将我的&lt;id&gt; 传递到映射为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");
    }
    

    完整性注意事项,如 cmets 中所述:

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

    不利的一面是,该孩子被表示为孩子的集合:IList&lt;GroupSummaryLevel&gt;。它使用起来并不那么简单,但我们可以创建一些虚拟属性,返回.FirstOrDefault()。我们得到的好处 - 是延迟加载(不是一对一的)

    【讨论】:

    • 根据您的建议进行更改后,我收到以下错误:“尝试添加多对一的“父级”时已添加。”我肯定错过了什么。那么 GroupSummarLevel 中的引用可能会导致这种情况?
    • 这里最合理的映射是不是一对一的。在您的情况下,实际上它似乎不是一对一而是一对多。因为如果我读得好,可能会有更多的GroupSummaryLevel 和相同的AcctGroup。因此,我将更改 Group 以收集摘要...一对多。您可以在其之上拥有虚拟财产,与 SummaryLevels.First()... 合作,老实说,这对我来说很有意义
    • 很好的决定,如果不是很好;) 它确实有一些问题......但最后......我在这些情况下使用的是相同的。对您来说最大的好处:它将是 NHibernate 原生的……您将获得所有积极的东西;)但是……它是一对多的;)享受 NHibernate
    • Nhibernate 一定不错,我的同事和导演都很兴奋,我们才刚刚开始使用它。作为这方面的初学者,我发现它有点复杂,但希望能到达那里。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2014-05-26
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 2011-04-21
    相关资源
    最近更新 更多