4

有人可以帮助我以最佳方式在流利的 nHibernate 中映射以下情况吗?Address 类在 Client 和 Company 中都使用。如何在 SQL 中最有效地存储它?映射应该是什么样的?我考虑过多种选择,但对于这些情况,我对 nHibernate 的经验不够:

  1. 使用 1 个地址实体和 1 个表并使用分母列来区分客户地址和公司地址 -> 如何在 nHibernate 中实现这一点?

  2. 使用 1 个地址实体和 2 个表(ClientAddresses 和 CompanyAddresses)--> 但我只能在类 Address 的映射中定义 1 个表

  3. 使用 2 个地址实体和 2 个表 --> 不那么优雅

当我开始实现公司类并意识到它也需要多个地址时,我刚刚偶然发现了这个问题。到目前为止,我有一个 Address 和 Client 类,并且它们之间有一个一对多的映射。在数据库中,地址有一个名为 ClientId 的额外列。但是在介绍公司课程时,我被困住了......

任何帮助将不胜感激。

我目前在使用自动映射的sharparch 1.5框架中工作,我的映射文件是这样的:

public class AddressMap : IAutoMappingOverride<Address>
{
    public void Override(AutoMapping<Address> mapping)
    {
        mapping.Table("addresses");
        mapping.Id(x => x.Id, "AddressGuid")
             .UnsavedValue(Guid.Empty)
             .GeneratedBy.GuidComb();

        mapping.References(x => x.Client, "ClientGuid");

    }
}

下面的更多代码说明了问题:

地址

public class Address
{
   public virtual string StreetLine1 { get; set; }
   public virtual string StreetLine2 { get; set; }
   public virtual string PostalCode { get; set; }
   public virtual string City { get; set; }
   public virtual string Country { get; set; }
}

其中有下表:

表名 = 地址
字段 = AddressGuid、StreetLine1、StreetLine2、邮政编码、城市、国家

客户

public class Client
{
    public IList<Address> Addresses {get;set;}
}

公司

public class Company
{
    public IList<Address> Addresses {get;set;}
}
4

2 回答 2

1

看起来您可以使用 nHibernate 的<any>映射实现 #1。请注意,在这种情况下,您不能指定外键约束。

一个例子<any>

流畅的 nHibernate 语法

于 2010-10-18T21:36:12.647 回答
0

您可以将关系建模为多对多:许多公司对许多地址,许多客户对许多地址。

在您的公司和客户映射中:

mapping.HasManyToMany(x => x.Addresses);

这将创建两个额外的表:一个是公司和地址之间的映射,另一个是客户和地址之间的映射。

从理论上讲,这可能允许您可能不想要的共享情况(某些公司和客户都共享相同的地址行),但只要您的应用程序逻辑不允许这种情况发生,您就可以了不必对 nhibernate 做任何棘手的事情。

于 2010-10-18T20:56:20.030 回答