我正在EF 4.1中迈出我的第一步。因为我一直使用NHibenate,所以代码优先方法对我来说似乎是最好的方法。我在一对���(或多对一)关系的良好映射方面遇到了问题。假设我有两个实体:
class ClientModel
{
int ClientID;
string Name;
virtual IList<OrderModel> Orders;
}
class OrderModel
{
int OrderID;
string Details;
virtual ClienModel Client;
}
当我这样离开的时候,在生成数据库的过程中会出现错误 - 表中的键丢失了。我想到可以通过将键的名称更改为ID(但这与我的命名约定不符)或添加[Key]注释来解决此问题。即使我添加了此注释,表的名称仍然是错误的 - 就像类名称一样,但带有's'。
所以我尝试使用流畅的API - 我进行了映射。但是,如果我设置映射就像这里一样:
class ClientMapping
{
ClientMapping()
{
this.HasKey(e => e.ClientID).Property(e => e.ID).HasColumnName("ClientID");
this.Property(e => e.Name).HasColumnName("Name");
this.HasMany(e => e.Orders).WithOptional().Map(p => p.MapKey("OrderID")).WillCascadeOnDelete();
this.ToTable("Clients");
}
}
class OrderMapping
{
OrderMapping()
{
this.HasKey(e => e.OrderID).Property(e => e.OrderID).HasColumnName("OrderID");
this.Property(e => e.Details).HasColumnName("Details");
this.HasRequired(e => e.Client).WithMany().Map(p=>p.MapKey("Client")).WillCascadeOnDelete(false);
this.ToTable("Orders");
}
}
数据库中表之间的关系是双重的。使用代码优先方法进行一对多关系的适当方法是什么?我的想法是正确的吗,还是错误的方法?
编辑
好的,我已按@Eranga所示的方式完成了,但仍存在一个问题。当我从数据库获取客户端时,它的订单属性为空(但在数据库中它有一些订单,其中Order.ClientID == Client.ClientID)。
Orders
是一个属性而不是一个字段。 - Erangavirtual List<OrderModel> Orders;
代替virtual IList<OrderModel> Orders;
。 - Jo Smo