Сначала сопоставление с кодом инфраструктуры сущностей

Я пытаюсь сопоставить свои сущности, используя Entity Framework "сначала код", но у меня проблема с сопоставлением сложного типа. Вот мой упрощенный пример:

Объект домена выглядит так:

public class Customer
{
    public Address DeliveryAddress {get; set;}
}

public class Address
{
    public string StreetName {get; set;}
    public string StreetNumber {get; set;}
    public City City {get; set;}
}

public class City
{
    public int Id {get; set;}
    public string Name {get; set;}
}

и отображение:

public class CustomerConfiguration : EntityConfiguration<Customer>
{
    public CustomerConfiguration()
    {
        this.HasKey(b => b.Id);
        this.Property(b => b.Id).IsIdentity();

        this.MapSingleType(x => new
        {
            Id = x.Id,
            DeliveryAddress_StreetName = x.DeliveryAddress.StreetName,
            DeliveryAddress_StreetNumber = x.DeliveryAddress.StreetNumber,
            DeliveryAddress_CityId = x.DeliveryAddress.City.Id, // this line causes an exception
        }).ToTable("Customer");
    }
}

public class AddressConfiguration : ComplexTypeConfiguration<Address>
{
    public AddressConfiguration()
    {           
        this.Property(b => b.StreetName).HasMaxLength(100).IsRequired().IsUnicode();
        this.Property(b => b.StreetNumber).HasMaxLength(6).IsRequired().IsUnicode();
}

public class CityConfiguration : EntityConfiguration<City>
{
    public CityConfiguration()
    {
        this.HasKey(b => b.Id);
        this.Property(b => b.Id).IsIdentity();
        this.Property(b => b.Name).IsRequired().HasMaxLength(200).IsUnicode();

        this.MapSingleType(x => new
        {
            Id = x.Id,
            Name = x.Name,
        }).ToTable("City");
    }
}

Выдается исключение: «Данный ключ отсутствует в словаре».

Может кто-нибудь помочь мне?


person L-Four    schedule 04.10.2010    source источник


Ответы (3)


Вы пытаетесь добавить тип объекта сайта к сложному типу адреса. Это невозможно. Подобно сущностям, сложные типы состоят из скалярных свойств или других свойств сложного типа. Поскольку сложные типы не имеют ключей, объекты сложного типа не могут управляться Entity Framework отдельно от родительского объекта.
Взгляните на Статья сложного типа для получения дополнительной информации.

person Devart    schedule 05.10.2010
comment
Спасибо за ответ! Итак, в этом случае я должен сделать адрес агрегатом (что, я думаю, не имеет особого смысла) или я должен не включать город в адрес, а вместо этого CityId (что может работать для меня, мне не обязательно нужен объект City сам). - person L-Four; 05.10.2010
comment
Еще кое-что: может ли сложный тип быть необязательным? Если я назначу null для адреса и сохраню его, он выдаст исключение, что он не может быть нулевым? - person L-Four; 05.10.2010
comment
msdn.microsoft.com/en-us/library/bb738472.aspx: Свойства сложного типа не могут быть нулевыми. InvalidOperationException возникает, когда вызывается SaveChanges и встречается нулевой сложный объект. Думаю, это ответ на мой вопрос. Проблема в том, что у меня есть обязательный адрес и дополнительный адрес... - person L-Four; 05.10.2010

Ваша конфигурация адреса не связывает адрес с городом.

person Shiraz Bhaiji    schedule 05.10.2010
comment
Я не думаю, что смогу сделать это в AddressConfiguration, потому что он наследуется от ComplexTypeConfiguration‹Address›... или я ошибаюсь? - person L-Four; 05.10.2010

Ссылка на класс предназначена, если вы хотите использовать свойства навигации Entity Frameworks. Для этого вы должны сделать ссылки на классы виртуальными. Так что в Address свойство City должно быть виртуальным. Также для простоты настройки (особенно если вы используете MVC) вы должны указать значение идентификатора на стороне, которая содержит ссылку, подобную этой.

public virtual City City {get; set;}
public int CityId {get; set;}
person Seth Paulson    schedule 13.05.2011