Entity framework 4 如何创建一个组合键,该组合键首先包含一个带代码的外键?

Entity framework 4 如何创建一个组合键,该组合键首先包含一个带代码的外键?,entity-framework-4,code-first,ef4-code-only,ef-code-first,Entity Framework 4,Code First,Ef4 Code Only,Ef Code First,我首先使用EF4代码,希望生成一个由类属性和外键组成的复合键。我有两门课:订单和公司。Order类包含一个引用,但这在公司之间不一定是唯一的。因此,我打算使用由Reference和Company.CompanyId组成的复合键 我已尝试使用以下方法进行设置,但收到错误消息“密钥表达式无效” 任何帮助都将不胜感激。有一件事情看起来不太正确,那就是您使用了非通用版本的ICollection。试试这个: public virtual ICollection<Order> Orders {

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

我已尝试使用以下方法进行设置,但收到错误消息“密钥表达式无效”


任何帮助都将不胜感激。

有一件事情看起来不太正确,那就是您使用了非通用版本的ICollection。试试这个:

public virtual ICollection<Order> Orders { get; set; }
公共虚拟ICollection订单{get;set;}
你试过这个吗

modelBuilder.Entity().HasKey(o=>o.Reference);
modelBuilder.Entity().HasKey(o=>o.CompanyId)

根据,键中只允许标量属性。导航属性不可用。

正如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; }
}
然后使用模型生成器创建复合关键点:

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.CompanyId }); 
modelBuilder.Entity().HasKey(o=>new{o.Reference,o.CompanyId});
注意,数据注释(RelatedTo属性)是在实体框架CTP3中引入的。有关仅使用数据注释而不是HasKey方法的另一个选项,请参阅本文:

public virtual ICollection<Order> Orders { get; set; }
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 });