【问题标题】:how do i create a composite key that comprises a foreign key with code first?我如何创建一个复合键,它首先包含一个外键和代码?
【发布时间】:2010-10-21 10:15:41
【问题描述】:

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

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

    正如 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 方法的另一个选项,请参阅此帖子:

    【讨论】:

      【解决方案2】:

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

      public virtual ICollection<Order> Orders { get; set; }
      

      【讨论】:

        【解决方案3】:

        你试过了吗?

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

        【讨论】:

          【解决方案4】:

          根据this source,键中只允许使用标量属性。导航属性不是。

          【讨论】:

            猜你喜欢
            • 2023-04-05
            • 1970-01-01
            • 2022-01-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多