我正在迈出 EF 4.1 的第一步。因为我使用的是 NHibenate,代码优先方法在我看来是最好的方法。我对一对多(或多对一)关系的良好映射有疑问。假设我有 2 个实体:
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");
}
}
数据库中表之间的关系加倍。 使用代码优先方法建立一对多关系的正确方法是什么?我的想法是正确的还是错误的方法?
编辑
OK,我已经按照@Eranga展示的方式做了,但是还是有问题。当我从数据库中获取 Client 时,它的 Orders 属性为空(但在数据库中它有一些 Order.ClientID == Client.ClientID 的订单)。
最佳答案
您需要映射参与关系的两个属性。您需要将 ClientID
列添加到 Orders 表。
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).WithRequired(o => o.Client)
.Map(p => p.MapKey("ClientID")).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.ToTable("Orders");
}
}
从一个实体配置关系就足够了。
关于entity-framework - Entity Framework 一对多关系代码优先,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7500747/