nhibernate - 将多对多关系映射为 IDictionary

标签 nhibernate fluent-nhibernate

我正在尝试映射具有多对多关系的 Person 和 Address 类。我想将 Address 集合映射为 IDictionary,并将 Address 属性 Type 作为键。该关系仅从 Person 端映射。

public class Person
{
    public IDictionary<int, Address> Addresses { get; set; }
}

public class Address
{
    public int Type { get; set; }
}

我使用的映射是:

HasManyToMany<Address>(x => x.Addresses).Table("PersonAddress")
    .ParentKeyColumn("PersonId").ChildKeyColumn("AddressId")
    .AsMap(x => x.Type);

问题是发出的SQL是:

SELECT addressesd0_.PersonId    as PersonId1_,
   addressesd0_.AddressId       as AddressId1_,
   addressesd0_.Type            as Type1_,
   address1_.AddressId          as AddressId5_0_
   -- etc.
FROM   dbo.PersonAddress addressesd0_
   left outer join dbo.Address address1_
     on addressesd0_.AddressId = address1_.AddressId
WHERE  addressesd0_.PersonId = 420893

它正在尝试从不存在的多对多连接表中选择类型。我尝试了多种映射变体,但均未成功。

我该如何映射它?

最佳答案

这是不可能的。字典需要关系表中的键值。您拥有的表结构是一个简单的多对多包或集合。

我要做的,是将其映射为普通包或集,并在实体中提供类似字典的访问:

public class Person
{
    private IList<Address> addresses;

    public IEnumerable<Address> Addresses { get { return addresses; } }

    public Address GetAddressOfType(int addressType)
    {
      return addresses.FirstOrDefault(x => x.Type == addressType);
    }

    public void SetAddress(Address address)
    {
      var existing = GetAddressOfType(address.Type);
      if (existing != null)
      {
        addresses.Remove(existing);
      }
      addresses.Add(address);
    }
}

关于nhibernate - 将多对多关系映射为 IDictionary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071093/

相关文章:

nhibernate - 休眠状态下的左外连接

nhibernate - 使用 NHibernate 同时插入父子节点

c# - Fluent Nhibernate 映射通过两个非主键列连接

NHibernate 2.1.2 抛出 DateTime 空溢出异常

C# 单元测试中未捕获的异常

c# - NHibernate:在更新/删除/插入映射到 View 的类时是否可以使用存储过程?

nhibernate - 如何使用 Fluent NHibernate 设置自定义 DriverConnectionProvider

NHibernate Fluent 与属性

c# - Linux/Mono 上的 YSOD 故障排除

c# - Fluent NHibernate - 一对至多 (1 – 0..1) 关系