EF4 - Можно ли использовать POCO как Entity и ComplexType? - PullRequest
1 голос
/ 30 января 2011

Я использую 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 ]

1 голос
/ 31 января 2011

Все, что вам нужно сделать, это поместить 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. Сложные типы

0 голосов
/ 31 января 2011

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

Взгляните сюда: http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx

...