2010-10-04 2 views
1

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

объект домена выглядит следующим образом:

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"); 
    } 
} 

Исключение, которое бросают в: «Данный ключ не присутствовал в словаре «.

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

ответ

1

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

+0

Спасибо за ответ! Таким образом, в этом случае я должен сделать адрес агрегированным (что не так уж много смысла), или я не должен включать City in Address, но вместо CityId (который может работать для меня, мне не обязательно нужен объект City сам). –

+0

Что-то еще: может ли сложный тип быть дополнительным? Если я присваиваю значение null для адреса и сохраняю его, он выдает исключение, которое не может быть недействительным? –

+0

http://msdn.microsoft.com/en-us/library/bb738472.aspx: Сложные свойства типа не могут быть пустыми. InvalidOperationException возникает при вызове SaveChanges и встречается нулевой сложный объект. Думаю, это отвечает на мой вопрос. Проблема в том, что у меня есть адрес, который является обязательным, а другой адрес является необязательным ... –

0

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

+0

Я не думаю, что я могу сделать это в AddressConfiguration, потому что он наследует от ComplexTypeConfiguration

... или я не прав? –

0

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

public virtual City City {get; set;} 
public int CityId {get; set;} 
Смежные вопросы