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

我在 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的东西没有被删除。我对数据库的经验很少,但根据我的理解,这应该使用级联删除来修复,但我似乎无法配置它。


所以我的问题显然是:我该如何解决这个问题?


月关宝盒
浏览 181回答 1
1回答

Cats萌萌

首先,您必须明确地在查询中包含您的导航属性。由于某种原因RemoveRange,级联删除无法按预期工作,但是如果您一次又一次地迭代和删除,它就可以工作。var products = Set<SpecialProduct>().Include(p => p.MyProperties).ToList();products.ForEach(p => AllProducts.Remove(p));SaveChanges();
打开App,查看更多内容
随时随地看视频慕课网APP