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概念方面。
我现在做的事:
如果我从Model类中删除外键,EF仍然会生成迁移代码的外键。问题依然存在。
如果我从生成的代码中删除外键以进行迁移。问题仍然存在。(即使数据库中的表之间没有任何外键(
如果我将Product类属性CategoryId从int更改为string,EF将为表Product_CategoryId和Product_ShopId生成新的两列,并在这些列上放置外键。问题解决了。。。。
真的不知道问题出在哪里。当然,我不希望表中有这两列。我想要CategoryId和ShopId列中的直接外键。
真的。寻求任何建议。
从您的代码中,产品或类别应该从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应该抛出异常????