猿问

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

我有一张桌子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.


泛舟湖上清波郎朗
浏览 206回答 1
1回答

慕姐4208626

解决方案 1:首先使用现有配置,您必须先删除 的ProductDetails,Product然后再删除Product,如下所示:List<ProductDetails> productDetailsList =&nbsp; _dbContext.ProductDetails.Where(pd => pd.ProductId == Id).ToList();&nbsp;_dbContext.ProductDetails.RemoveRange(productDetailsList);&nbsp;&nbsp;var product = getProductById(Id);_dbContext.Product.Remove(product);_dbContext.SaveChanges();解决方案 2:在您的DbContext班级中,按如下方式重写实体配置:protected override void OnModelCreating(ModelBuilder modelBuilder){&nbsp; &nbsp;base.OnModelCreating(modelBuilder);&nbsp; &nbsp;modelBuilder.Entity<ProductDetails>().HasRequired(pd => pd.Product).WithMany(p => p.ProductDetails).HasForeignKey(pd => pd.ProductId).WillCascadeOnDelete(true);}现在运行一个新的迁移并相应地更新数据库。希望你的问题能得到解决!
随时随地看视频慕课网APP
我要回答