我正在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");
}
}
数据库中表之间的关系增加了一倍。 使用代码优先方法进行一对多关系的正确方法是什么?我是朝着一个好的方向思考还是错误的方法?
编辑
OK,我已经在路上@Eranga表现做了,但仍是一个问题。当我从数据库获取客户端时,其Orders属性为空(但在数据库中它有一些Order.ClientID == Client.ClientID的订单)。
我测试了我的答案给出的配置和正常工作。确保'订单'是一个财产,而不是一个领域。 – Eranga
尝试'虚拟列表订单;'而不是'虚拟IList 订单;' –