2

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

4 回答 4

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; }
}

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

modelBuilder.Entity<Order>().HasKey(o => new { o.Reference, o.CompanyId }); 

请注意,Entity Framework CTP 3 引入了数据注释(RelatedTo 属性)。有关仅使用数据注释而不是 HasKey 方法的另一个选项,请参阅这篇文章:

于 2010-11-20T05:37:10.987 回答
1

你试过这个吗?

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

于 2010-11-12T03:44:49.957 回答
1

看起来不太正确的一件事是您使用了 ICollection 的非泛型版本。尝试这个:

public virtual ICollection<Order> Orders { get; set; }
于 2010-10-28T02:19:28.780 回答
0

根据这个来源,键中只允许标量属性。导航属性不是。

于 2010-11-19T22:59:01.707 回答