我正在使用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 =)
答案 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。