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

C# 与TPT代码优先实体框架中的引用约束冲突,c#,.net,entity-framework,entity-framework-6,C#,.net,Entity Framework,Entity Framework 6,我首先在Entity Framework 6中使用TPT代码,并具有以下设置: 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

我首先在Entity Framework 6中使用TPT代码,并具有以下设置:

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语句与引用约束FK_dbo.Properties_dbo.SpecialProducts_Product_ProductID冲突。数据库MyDataBase表dbo.Properties列“Product\u ProductID”中发生冲突

对我来说,这听起来像是属于被删除的特殊产品的属性没有被删除。我对数据库几乎没有经验,但据我所知,这应该使用级联删除来修复,但我似乎无法配置它

所以我的问题很明显:我该如何解决这个问题

在我的情况下似乎没有帮助,但可能对其他人有用的潜在重复项:


首先,必须在查询中明确包含导航属性。由于某些原因,RemoveRange不能像cascade delete预期的那样工作,但是如果您迭代并逐个删除,它就会工作

var products = Set<SpecialProduct>().Include(p => p.MyProperties).ToList();
products.ForEach(p => AllProducts.Remove(p));
SaveChanges();

RemoveSomeProducts中的products var是否包含属性列表?或者MyProperties是空的?@Joaoruimatins你可能发现了什么,它确实是空的。我试过使用所有产品。包括。。。就像我提到的第三个链接一样,但这不起作用,因为并非所有产品都有属性。它抛出一个异常。这可能就是问题所在。或者当产品实际上是与属性相关的特殊产品时,全面使用产品。有什么理由要拆分这些类吗?根据我的经验,你最终会遇到各种各样的问题。只有在真正需要的时候才在EF实体中使用继承。好吧,让我们这样说:继承是有意义的。我可以做TPH,但是有一个大的非标准化的表,在将来必须扩展,对我来说听起来不是最好的解决方案。如果可能的话,我宁愿保留TPT,使MyProperties成为虚拟财产,并检查在添加.Include.com时是否仍然出现相同的错误。您的解决方案的第一行正是我所需要的。但是,我无法确认Removatange是否不起作用。对我来说,它工作得很好。