c# - Entity Framework 级联删除使用linq

标签 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)

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

 var product = getProductById(Id);
_dbContext.Product.Remove(product);
_dbContext.SaveChanges();

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

_dbContext.Product.cascadeDelete...   //this is not real code

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

谢谢

最佳答案

解决方案一:

在删除 Product 之前,首先必须删除 ProductProductDetails,如下所示:

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();

方案二:

在您的 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);
}

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

希望您的问题得到解决!

关于c# - Entity Framework 级联删除使用linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51845524/

相关文章:

C# 运算符== : what is standard practice (reference/value equality)?

c# - 从 ASP.NET 插入到 MS Access

c# - EntityFramework 5.0 中的基类/实体

html - 使用 css 定位子 html 元素

c# - JavaScript 中的 MVC C# 代码

asp.net - 如何添加IDesignTimeDbContextFactory的实现以将迁移添加到.Net Core 2.0应用程序?

c# - PayPal IPN 集成(快速结账 - Razor/C#)

c# - 无法定位 Android 应用中内存泄漏的原因

c# - Entity Framework 中的 NHibernate 的 SchemaUpdate(代码优先)?

entity-framework - CQRS 是 CRUD 的替代品吗?