使用 linq 实体框架级联删除

ev *_* vk 5 c# asp.net-mvc entity-framework

我有一张桌子Products和另一张桌子ProductDetails

  CreateTable(
            "dbo.Products",
            c => new
                {
                    Id = c.Guid(nullable: false),
                    // other fields here
                    // ....
                    //....
                })
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.ProductType", t => t.ProductTypeId, cascadeDelete: false)
            .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: false)
            .Index(t => t.UserId)
            .Index(t => t.ProductTypeId);

 CreateTable(
            "dbo.ProductDetails",
            c => new
                {
                    Id = c.Guid(nullable: false),
                    // other fields here
                    // ....
                    //....
                })
            .PrimaryKey(t => t.Id)                
            .ForeignKey("dbo.Products", t => t.ProductId, cascadeDelete: false)
            .Index(t => t.ProyectoId)
Run Code Online (Sandbox Code Playgroud)

如您所见,当我创建此表时,我禁用了cascadeDelete. 然而,经过一些开发后,我意识到我需要删除一个产品。现在,我的问题是我不能通过这样做来删除产品

 var product = getProductById(Id);
_dbContext.Product.Remove(product);
_dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

如何级联删除我的产品表?我可以做一些类似查询之类的事情吗cascadeDelete

_dbContext.Product.cascadeDelete...   //this is not real code
Run Code Online (Sandbox Code Playgroud)

如果不可能,我如何更改我的表ProductsProductDetails.

谢谢

Tan*_*jel 4

解决方案1:

对于现有配置,您必须首先删除 ,然后ProductDetailsProduct删除,Product如下所示:

List<ProductDetails> productDetailsList =  _dbContext.ProductDetails.Where(pd => pd.ProductId == Id).ToList();
 _dbContext.ProductDetails.RemoveRange(productDetailsList);  

var product = getProductById(Id);
_dbContext.Product.Remove(product);
_dbContext.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

解决方案2:

在您的DbContext类中重写实体配置,如下所示:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
   base.OnModelCreating(modelBuilder);

   modelBuilder.Entity<ProductDetails>().HasRequired(pd => pd.Product).WithMany(p => p.ProductDetails).HasForeignKey(pd => pd.ProductId).WillCascadeOnDelete(true);
}
Run Code Online (Sandbox Code Playgroud)

现在运行新的迁移并相应地更新数据库。

希望您的问题能够得到解决!