EF4 - POCO可以同时用作实体和ComplexType吗?

时间:2011-01-30 20:49:29

标签: entity-framework-4 entity-framework-ctp5 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成为Order类的ComplexType?在玩完这个之后,我猜不是,但也许有一种我没见过的方式。

编辑:为了回应下面的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'不是实体'Order'的声明属性。” 尝试使用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'不能包含在其映射中。”

我放弃了。也许最终版本会有这样的东西。或者我可能需要切换到NHibernate =)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

如果你希望Address与Order在同一个表中,你将不得不在DbContext OnModelCreating覆盖中告诉EF。

看看这里:http://weblogs.asp.net/scottgu/archive/2010/07/23/entity-framework-4-code-first-custom-database-schema-mapping.aspx