1

Я использую EF4 CTP5. Вот мой POCO которые:EF4 - Может ли POCO использоваться как Entity, так и ComplexType?

public class Address 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Line1 { get; set; } 
    public string Line2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string PostalCode { get; set; } 
} 

public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Address> Addresses { get; set; } 
    public List<Order> Orders { get; set; } 
} 

public class Order 
{ 
    public int Id { get; set; } 
    public decimal Total { get; set; } 
    public Address ShippingAddress { get; set; } 
    public Address BillingAddress { get; set; } 
} 

Есть ли способ, чтобы получить адрес, чтобы быть ComplexType для класса Order? Поиграв с этим, я предполагаю, что нет, но, возможно, есть способ, которого я не видел.

EDIT: В ответ на Shawn ниже, я дал ему мой лучший выстрел:

//modelBuilder.Entity<Order>().Ignore(o => o.BillingAddress); 
//modelBuilder.Entity<Order>().Ignore(o => o.ShippingAddress); 
modelBuilder.Entity<Order>() 
    .Property(o => o.BillingAddress.City).HasColumnName("BillingCity"); 

терпит неудачу во время выполнения с ошибкой «Настроенный свойство„BillingAddress“не объявлен собственностью на предприятие 'Порядок'." Попытка использовать Ignore() не работает. Далее, статья Hanselman является CTP4, но эквивалент CTP5 является:

modelBuilder.Entity<Order>().Map(mapconfig => 
{ 
    mapconfig.Properties(o => new { 
     o.Id 
     , o.Total 
     , o.BillingAddress.City 
    }); 
    mapconfig.ToTable("Orders"); 
}); 

с ошибкой «Свойство„BillingAddress.City“типа„Order“не может быть включен в его отображении.»

Я сдаюсь. Возможно, в финальном выпуске будет что-то вроде этого. Или, может быть, мне нужно переключиться на NHibernate =)

ответ

1

Все, что вам нужно сделать, это поместить ComplexTypeAttribute на адрес класса:

[ComplexType] 
public class Address 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Line1 { get; set; } 
    public string Line2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string PostalCode { get; set; } 
} 

В качестве альтернативы, вы можете достичь этого беглого API:

protected override void OnModelCreating(ModelBuilder modelBuilder) 
{ 
    modelBuilder.ComplexType<Address>(); 
} 

Но вы, , не можете иметь тип адреса, который должен быть как сущностью, так и сложным типом, это один из способов или другой.

Взгляните на этом блоге, где я обсуждаю это подробно:
Associations in EF Code First CTP5: Part 1 – Complex Types

+0

Если я объявляю modelBuilder.ComplexType

() ;, что произойдет с моим списком
? – anon

+0

Начиная с вашей текущей настройки, он будет проигнорирован, но если вы попытаетесь установить на нем ассоциацию (либо с помощью свободного API, либо даже добавив свойство навигации, например Customer, в класс Address), тогда EF будет бросать и напоминать вам, что Address является сложным типом и не может участвовать в ассоциациях FK. –

+0

Я пробовал некоторые предложения Шона и добавил их на свой пост. Дайте мне знать, если вы можете думать о каких-либо других «хаках». (Кстати, у меня есть открытый вопрос здесь, и я хотел бы услышать ваш вклад: http://stackoverflow.com/questions/4703378/ef4-independent-associations-why-avoid-them) – anon

0

Если вы хотите, чтобы Address находился в той же таблице, что и Order, вам нужно сказать EF, что в переопределении DbContext OnModelCreating.

Посмотрите здесь: http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx

+0

Я сделал несколько попыток (см мои правки в главный пост), но я не думаю, что вы правы. Посмотрите и дайте мне знать, если у вас есть предложения. – anon