我有一个表 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
如果不可能,我该如何更改表 Products
和 ProductDetails
。
谢谢
最佳答案
解决方案一:
在删除 Product
之前,首先必须删除 Product
的 ProductDetails
,如下所示:
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/