如何创建一个包含外键的复合键,代码优先?

时间:2010-10-21 10:15:41

标签: entity-framework-4 code-first ef4-code-only ef-code-first

我首先使用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; }
}

非常感谢任何帮助。

4 个答案:

答案 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,密钥中只允许标量属性。导航属性不是。