Отображение отношения многие ко многим как IDictionary - PullRequest
2 голосов
/ 16 августа 2011

Я пытаюсь отобразить класс Person и Address, который имеет отношение «многие ко многим».Я хочу сопоставить коллекцию адресов как IDictionary со свойством Тип адреса в качестве ключа.Отношение отображается только со стороны 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

Попытка выбрать тип из таблицы соединений «многие ко многим», которая не существует.Я пробовал несколько вариантов сопоставления без успеха.

Как я могу сопоставить это?

Ответы [ 2 ]

5 голосов
/ 19 августа 2011

Это невозможно.Словари нуждаются в значении ключа в реляционной таблице.Структура вашей таблицы - это простая сумка или набор «многие ко многим».

Что бы я сделал, сопоставил бы ее как обычную сумку или набор и предоставил бы словарный доступ в сущности:

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);
    }
}
0 голосов
/ 16 августа 2011

Вам необходимо использовать компоненты:

HasMany<Address>(x => x.Addresses) 
               .AsMap<int>("FieldKey")  
               .Component(x => x.Map(c => c.Id)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...