为了账号安全,请及时绑定邮箱和手机立即绑定

与 TPT 代码优先实体框架中的引用约束冲突

与 TPT 代码优先实体框架中的引用约束冲突

C#
月关宝盒 2021-11-28 19:38:34
我在 Entity Framework 6 中使用 TPT code-first 并具有以下设置:public abstract class Product{    [Key]    public string ProductID { get; set; }    // a bunch of trivial properties like dates and floats}[Table("SpecialProducts")]public class SpecialProduct : Product{    // more trivial properties    public List<Property> MyProperties { get; set; }}public class Property{    [Key]    public int ID { get; set; }    [Required]    public SpecialProduct Product { get; set; }    // property data}public class MyDbContext : DbContext{    public DbSet<Product> AllProducts { get; set; }    public MyDbContext()        : base("MyDataBase")    {}    public RemoveSomeProducts()    {        var products = from product in AllProducts where /* some condition */ select product;        AllProducts.RemoveRange(products);        SaveChanges();    }    protected override void OnModelCreating(DbModelBuilder modelBuilder)    {        // I know I don't need both statements, and my guess is I need the first, but at this point I don't know anything anymore        modelBuilder.Entity<Property>()            .HasRequired(property => property.Product)            .WithMany(product => product.MyProperties)            .WillCascadeOnDelete(true);        modelBuilder.Entity<SpecialProduct>()            .HasMany(product => product.MyProperties)            .WithRequired(property => property.Product)            .WillCascadeOnDelete(true);    }}调用时RemoveSomeProducts()出现以下异常:SqlException: DELETE 语句与 REFERENCE 约束“FK_dbo.Properties_dbo.SpecialProducts_Product_ProductID”冲突。冲突发生在数据库“MyDataBase”、表“dbo.Properties”、“Product_ProductID”列中。对我来说,这听起来像是Properties被删除SpecialProducts的东西没有被删除。我对数据库的经验很少,但根据我的理解,这应该使用级联删除来修复,但我似乎无法配置它。所以我的问题显然是:我该如何解决这个问题?
查看完整描述

1 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

首先,您必须明确地在查询中包含您的导航属性。由于某种原因RemoveRange,级联删除无法按预期工作,但是如果您一次又一次地迭代和删除,它就可以工作。


var products = Set<SpecialProduct>().Include(p => p.MyProperties).ToList();

products.ForEach(p => AllProducts.Remove(p));

SaveChanges();


查看完整回答
反对 回复 2021-11-28
  • 1 回答
  • 0 关注
  • 180 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信