NHibernate连接表映射

时间:2009-07-15 21:09:29

标签: nhibernate collections join

我有一个有趣的问题,我似乎找不到令人满意的答案。它涉及连接表。

基本上(我确定这已经以某种形式出现在这里,但我找不到)我有3张桌子。 Person表,地址表,PersonAddress ..

是PersonID 名称 年龄 等。

地址

AddressID
AddressLine1
AddressLine2

国家
拉链

PersonAddress

AddressID
是PersonID
地址类型

AddressType在联接表上的原因很简单,因为这些地址可以在整个公司的人员之间共享,如运输类型,物理位置或结算。

甚至可能将这些作为集合或其他东西加入

我想管理类似这样的事情

地址类

AddressLine1
AddressLine2

国家
邮编
地址类型

人员类

名称
年龄
IListAddresses

此人将为自己持有一系列地址。

如果有人能用Fluent或直接XML映射完成此任务,那就太棒了。我觉得这应该很简单,但我很想念它。并没有正确的语言(桥牌表,连接表,收集表,连接部分表)我似乎不能谷歌来拯救我的生命。

提前感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

我认为如果我理解正确的话,这很容易实现。 :)你有一个Person对象,你希望它包含一些属性和一个人的地址集合,也可以在其他用户之间共享,对吗?好吧,要使用Fluent NHibernate设置它,我会做这样的事情:

// Person Entity
public class Person
{
    public int Id { get; private set; }
    public string Name { get; set; }
    public IList<PersonAddress> Addresses { get; set; }
}

// Fluent Mapping
public class PersonMap : ClassMap<Person>
{
    public PersonMap() {
        Id(x => x.Id);
        Map(x => x.Name);
        HasMany(x => x.Addresses).Cascade.All();
    }
}

// Address Entity
public class Address
{
    public int Id { get; private set; }
    public string Address1 { get; set; }
    public string City { get; set; }
    public IList<PersonAddress> People { get; set; }
}

// Fluent Mapping
public class AddressMap : ClassMap<Address>
{
    public AddressMap() {
        Id(x => x.Id);
        Map(x => x.Address1);
        Map(x => x.City);
        HasMany(x => x.People).Cascade.All();
    }
}

// PersonAddress Entity
public class PersonAddress
{
    public int Id { get; private set; }
    public Person Person { get; set; }
    public Address Address { get; set; }
    public AddressType Type { get; set; }
}

// Fluent Mapping
public class PersonAddressMap : ClassMap<PersonAddress>
{
    public PersonAddressMap() {
        Id(x => x.Id);
        References(x => x.Person);
        References(x => x.Address);
        Map(x => x.Type).CustomTypeIs(typeof(AddressType));
    }
}

基本上,这允许Person拥有一组地址,并且这些地址可以在公司(多人)之间共享。您几乎拥有多对多设置,但由于您在PersonAddress中存储状态信息,因此它在Person和Address Entity中成为两个一对多关系。

对不起,如果我给你超过你想要的!只是觉得打字! :P

请告诉我这是否有帮助,或者如果您有任何疑问,或者我完全偏离基础。

答案 1 :(得分:1)

我会将AddressType移离PersonAddress表并将其放在地址表中。然后,您应该能够映射常规的多对多映射。

public class PersonMap : ClassMap<Person>  
{  
public PersonMap()  
  {  
    Id(x => x.PersonId);  
    Map(x => x.Name);  
    HasManyToMany(x => x.Addresses)  
     .Cascade.All()  
     .WithTableName("PersonAddress");  
  }  
}  

答案 2 :(得分:0)

您可以设置一个连接Person和PersonAddress表的数据库视图。然后可以创建一个包含AddressType的nHibernate Address对象,即使在您拥有所需的表结构的情况下也是如此。

相关问题