【问题标题】:nHibernate mapping for entity to multiple different parent entities (eg Addres -> Firm, Addres -> Client)实体到多个不同父实体的 nHibernate 映射(例如地址 -> 公司,地址 -> 客户端)
【发布时间】:2011-02-15 03:22:53
【问题描述】:

有人可以帮助我用流利的 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; }
}

其中有下表:

表名 = 地址
fields= AddressGuid, StreetLine1, StreetLine2, PostalCode, City, Country

客户

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

公司

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

【问题讨论】:

  • 可悲的是我有完全相同的问题。让我们看看能不能得到一些指导。

标签: nhibernate mapping entity automapping


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 试过了,但没有将address_id持久化到共享表中
  • @mhenrixon 那么你做错了什么。也许您需要在关联上设置Cascade.All()
  • 我设置了 Cascade.SaveUpdate,我尝试使用逆而不是逆映射 xml 和流利。
【解决方案2】:

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

an example of &lt;any&gt;

Fluent nHibernate syntax

【讨论】:

  • 从未尝试过。我确实看到了它的美丽,也许这就是用例。它还说要非常小心,我不知道我大部分时间在做什么,所以也许那不适合我? :)
  • 我认为“小心”注释是因为您没有使用此方法获得参照完整性(在数据库中强制执行)。只要您意识到这一点,就应该没问题。
猜你喜欢
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多