我首先使用EF4代码,并希望生成一个由类属性和外键组成的复合键。我有两个班:订单和公司。 Order类包含引用,但这在公司之间不一定是唯一的。所以我打算使用由Reference和Company.CompanyId。
组成的复合键我已尝试使用以下设置但我收到错误消息“密钥表达式无效”。
modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company.CompanyId });
我也试过
modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company });
然后失败了。
这些是我的课程:
public class Order
{
public string Reference { get; set; }
public Company Company { get; set; }
}
public class Company
{
public int CompanyId { get; set; }
public virtual ICollection Orders { get; set; }
}
非常感谢任何帮助。
答案 0 :(得分:5)
正如Antony Highsky所提到的,你只能在密钥中使用标量属性。 因此,您需要将外键(标量属性)添加到订单类,并将其与导航属性公司关联,如下所示:
public class Order
{
public string Reference { get; set; }
public int CompanyId { get; set; }
[RelatedTo(ForeignKey = "CompanyId")]
public Company Company { get; set; }
}
然后使用模型构建器创建复合键:
modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.CompanyId });
请注意,数据注释(RelatedTo属性)是随Entity Framework CTP 3引入的。对于另一个仅使用数据注释而不是HasKey方法的选项,请参阅此帖子:
答案 1 :(得分:1)
一件看起来不太正确的事情是你使用非通用版本的ICollection。试试这个:
public virtual ICollection<Order> Orders { get; set; }
答案 2 :(得分:1)
你试过这个吗?
modelBuilder.Entity()。HasKey(o =&gt; o.Reference); modelBuilder.Entity()。HasKey(o =&gt; o.CompanyId);
答案 3 :(得分:0)
根据this source,密钥中只允许标量属性。导航属性不是。