1

我正在使用 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?在玩过这个之后,我猜不是,但也许有一种我没见过的方法。

编辑:为了回应下面的肖恩,我尽力而为:

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

失败并出现错误“'Order' 类型的属性 'BillingAddress.City' 不能包含在其映射中。”

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

4

2 回答 2

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

或者,您可以通过 fluent API 实现此目的:

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

但是您不能将地址类型同时作为实体和复杂类型,这是一种或另一种方式。

看看这篇我详细讨论的博客文章:
EF Code First CTP5 中的关联:第 1 部分 – 复杂类型

于 2011-01-30T21:28:37.937 回答
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

于 2011-01-30T21:11:15.950 回答