为了账号安全,请及时绑定邮箱和手机立即绑定

使用 linq 的实体框架级联删除

使用 linq 的实体框架级联删除

C#
泛舟湖上清波郎朗 2021-11-28 16:39:54
我有一张桌子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.
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

解决方案 1:


首先使用现有配置,您必须先删除 的ProductDetails,Product然后再删除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();

解决方案 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);

}

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


希望你的问题能得到解决!


查看完整回答
反对 回复 2021-11-28
  • 1 回答
  • 0 关注
  • 205 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信