2010-05-03 46 views
4

有人可以帮助我以最好的方式映射流利的nHibernate中的以下情况吗?地址类用于客户端和公司。如何在SQL中最有效地存储它?映射应该是什么样子?我也想过多种选择,但我没有足够的经验与NHibernate针对这些情况:实体nHibernate映射到多个不同的父实体(例如地址 - >公司,地址 - >客户端)

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

  2. 使用1个地址实体和2个表(ClientAddresses和CompanyAddresses) - >但我只可以在类地址

  3. 使用2个地址实体和2代表的映射定义1个表 - >不如此优雅

当我开始实施公司类,并意识到它也需要多个地址时,我就偶然发现了这个问题。到目前为止,我有一个地址和客户端类,它们之间有一对多的映射关系。在数据库中,地址有一个名为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,POSTALCODE,城市,国家

客户

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

公司

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

可悲的是我有相同的问题。让我们看看我们能否得到一些指导。 – mhenrixon 2010-10-18 20:40:42

回答

0

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

在这两种贵公司和客户端映射:

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

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

理论上,这可以允许共享的情况下(一些公司和客户都共享具有相同的地址行),你可能不希望,但只要你的应用程序逻辑不允许这样的事情发生,你会没问题,你不需要用nhibernate做任何棘手的事情。

+0

尝试过,但它并没有持续的ADDRESS_ID到共享表 – mhenrixon 2010-10-18 21:51:30

+0

@mhenrixon然后你做错了什么。也许你需要在关联上设置'Cascade.All()'? – 2010-10-18 22:12:46

+0

我有Cascade.SaveUpdate设置,我尝试使用反向映射xml和流畅。 – mhenrixon 2010-10-19 15:04:53

1

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

an example of <any>

Fluent nHibernate syntax

+0

从未尝试过。我确实看到了它的美,也许这就是用例。它也说要非常小心,我不知道我大部分时间都在做什么,所以也许这不适合我? :) – mhenrixon 2010-10-19 15:05:42

+0

我认为“小心”的说明是因为你没有通过这种方法获得参照完整性(在db中强制执行)。只要你意识到这一点,你应该没问题。 – 2010-10-19 15:33:43