EF 6-如何解决复合密钥的外键错误

本文关键字:密钥 复合 错误 解决 何解决 EF | 更新日期: 2023-09-27 18:00:54

我已经处理这个问题好几天了,找不到任何解决方案。

我使用的是代码优先策略。NET MVC 4.5和EF 6

我有两种型号的复合钥匙:

public class Category : DbContext
{
    [Key, Column(Order = 0),DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int CategoryId { get; set; }
    [Key, Column(Order = 1)]
    public int ShopId { get; set; }
    public string Name { get; set; }  
}
public class Product : DbContext
{
  [Key, Column(Order = 0),DatabaseGenerated(DatabaseGeneratedOption.Identity)]
  public int ProductId { get; set; }
  [Key, Column(Order = 1)]
  public int ShopId { get; set; }
  public int CategoryId { get; set; }
  [ForeignKey("CategoryId, ShopId")]        
  public virtual Category Category { get; set; }
}

当我运行添加迁移命令时,我在迁移文件夹中得到了以下代码:

 CreateTable(
  "dbo.Categories",
   c => new
   {
    CategoryId = c.Int(nullable: false, identity: true),
    ShopId = c.Int(nullable: false),
    Name = c.String(nullable: false, maxLength: 5)                  
   })
   .PrimaryKey(t => new { t.CategoryId, t.ShopId });
   CreateTable(
     "dbo.Products",
      c => new
      {
        ProductId = c.Int(nullable: false, identity: true),
        ShopId = c.Int(nullable: false),
        CategoryId = c.Int(nullable: false)
      })
      PrimaryKey(t => new { t.ProductId, t.ShopId })
      .ForeignKey("dbo.Categories", t => new { t.CategoryId, t.ShopId }, cascadeDelete: true)               
      .Index(t => new { t.ShopId, t.CategoryId });

然后,当我运行更新数据库命令时,一切正常,直到第一次通过EF访问数据库。我会得到这个错误:

表Product(ShopId,CategoryId(到表Category(CategoryId,ShopId(::不足映射:外键必须映射到某个AssociationSet或上参与外键关联的EntitySet概念方面。

我现在做的事:

  1. 如果我从Model类中删除外键,EF仍然会生成迁移代码的外键。问题依然存在。

  2. 如果我从生成的代码中删除外键以进行迁移。问题仍然存在。(即使数据库中的表之间没有任何外键(

  3. 如果我将Product类属性CategoryId从int更改为string,EF将为表Product_CategoryId和Product_ShopId生成新的两列,并在这些列上放置外键。问题解决了。。。。

真的不知道问题出在哪里。当然,我不希望表中有这两列。我想要CategoryId和ShopId列中的直接外键。

真的。寻求任何建议。

EF 6-如何解决复合密钥的外键错误

从您的代码中,产品或类别应该从DbContext继承有任何特定的原因吗?此外,试试下面的方法,它会起作用。我怀疑它失败的原因是"复合主键的一部分(在产品中(也是类别中外键(复合Fk(的一部分">

public class SampleContext : DbContext
    {
        public IDbSet<Category> Categories { get; set; }
        public IDbSet<Product> Products { get; set; }
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
             base.OnModelCreating(modelBuilder);
        }
    }
    public class Category
    {
        [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int CategoryId { get; set; }
        [Key, Column(Order = 1)]
        public int ShopId { get; set; }
        public string Name { get; set; }
    }
    public class Product 
    {
        [Key, Column(Order = 0), DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public int ProductId { get; set; }
        public int ShopId { get; set; }
        public int CategoryId { get; set; }
        [ForeignKey("CategoryId, ShopId")]
        public virtual Category Category { get; set; }
    }

如果这是你所期望的,请告诉我。首先,EF Migration Runner应该抛出异常????