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

use*_*833 2 code-first entity-framework-4 ef4-code-only ef-code-first

我首先使用EF4代码,并希望生成一个由类属性和外键组成的复合键.我有两个班:订单和公司.Order类包含引用,但这在公司之间不一定是唯一的.所以我打算使用由Reference和Company.CompanyId组成的复合键.

我已尝试使用以下设置它但我收到错误消息"键表达式无效".

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company.CompanyId });
Run Code Online (Sandbox Code Playgroud)

我也试过了

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.Company });
Run Code Online (Sandbox Code Playgroud)

这失败了.

这些是我的课程:

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; }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Lui*_*cha 5

正如Antony Highsky所提到的,你只能在键中使用标量属性.因此,您需要将一个外键(标量属性)添加到Order类,并将其与导航属性Company关联,如下所示:

public class Order
{
    public string Reference { get; set; }

    public int CompanyId { get; set; }

    [RelatedTo(ForeignKey = "CompanyId")]
    public Company Company { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

然后使用模型构建器创建组合键:

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.CompanyId }); 
Run Code Online (Sandbox Code Playgroud)

请注意,数据注释(RelatedTo属性)是随Entity Framework CTP 3引入的.对于另一个仅使用数据注释而不是HasKey方法的选项,请参阅以下文章: