EF4 - Можно ли использовать POCO как Entity и ComplexType?
Я использую EF4 CTP5. Вот мои POCO:
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; }
}
Есть ли способ получить Address, чтобы быть ComplexType для класса Order? После игры с этим, я думаю, нет, но, возможно, есть способ, которого я не видел.
РЕДАКТИРОВАТЬ: В ответ на Шона ниже, я дал ему мой лучший выстрел:
//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()
не работает Далее, статья Гензельмана - CTP4, но эквивалент CTP5:
modelBuilder.Entity<Order>().Map(mapconfig =>
{
mapconfig.Properties(o => new {
o.Id
, o.Total
, o.BillingAddress.City
});
mapconfig.ToTable("Orders");
});
Сбой с ошибкой "Свойство" BillingAddress.City "типа" Заказ "не может быть включено в его отображение."
Я сдаюсь. Возможно, в финальной версии будет что-то вроде этого. А может мне нужно перейти на NHibernate =)
2 ответа
Все, что вам нужно сделать, это разместить 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>();
}
Но вы не можете иметь тип адреса, который будет и сущностью, и комплексным типом, так или иначе.
Посмотрите на этот пост в блоге, где я обсуждаю это подробно:
Ассоциации в EF Code First CTP5: Часть 1 - Сложные типы
Если ты хочешь Address
чтобы быть в той же таблице, что и Order, вам нужно будет указать EF, что в переопределении DbContext OnModelCreating.
Посмотрите здесь: http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx