1

我想将 3 个表属性、业务、汽车指向名为实用程序的单个表。使用 Fluent NHibernate,我跟着

    public UtilityMap()
    {
        // some Mappings
        References<Automobile>(x => x.Automobile, "LeaseRefId").Cascade.None();
        References<Business>(x => x.Business, "LeaseRefId").Cascade.None();
        References<Property>(x => x.Property, "LeaseRefId").Cascade.None();
    }

在每个映射到实用程序的表中,我遵循

    public AutomobileMap()
    {
        //Some Mappings

        HasOne<Utility>(x => x.CommonDatas)
            .Cascade.All();
    }

“我希望在实用程序表中有一个列,可以存储所有三个(汽车、商业、财产)表的引用。但是流利的 Nhibernate 正在为每个引用的表创建外键列。我想避免这种情况。 "

有什么办法可以做到这一点??请建议提前致谢。

4

1 回答 1

1

要使其按预期工作,您需要有一个Automobile,Business和类的基Property类。让我们称之为LeaseSubject。据推测,您的域模型中已经有类似的东西。

您的 Utility 类应该只有一个属性,而不是现在的三个:

public virtual LeaseSubject LeaseSubject { get; set; }

这样,您不仅可以更轻松地映射,还可以提高代码的可维护性。如果在以后的某个时间您决定再拥有一个租赁标的物,即,Yacht怎么办?无需向 Utility 类添加另一个Yacht属性,您只需继承 from LeaseSubject,它可以包含在类的LeaseSubject属性中Utility

现在您可以将您的实用程序简单地映射为:

public UtilityMap() 
{
    // Other mappings...
    References(x => x.LeaseSubject, "LeaseRefId");
}

对于映射汽车、业务和属性类,您将使用三种可用的 NHibernate继承策略之一:

  • 每个类层次结构表
  • 每个子类的表
  • 每个具体类的表

对于FluentNHibernate继承映射,请看这里

由于您已经有单独的表格,我相信您的案例的正确策略是每个具体类的表格。您可以在本文中找到更多信息。

于 2012-06-10T00:06:28.527 回答