簡體   English   中英

級聯刪除在 Asp.net 5 和 EF Core 中不起作用

[英]Cascade Delete doesn't work in Asp.net 5 and EF Core

我正在嘗試從數據庫中刪除UserUser有自己的Recipes 即使我在 model 構建器中配置了級聯刪除,它也不起作用。

我得到的錯誤是:

SqlException:DELETE 語句與 REFERENCE 約束“FK_Recipes_AspNetUsers_ApplicationUserId”沖突。 沖突發生在數據庫“master”、表“dbo.Recipes”、列“ApplicationUserId”中。

應用用戶.cs

namespace WebApplication.Models
{
    public class ApplicationUser : IdentityUser
    {
        public ICollection<Recipe> Recipes { get; set; }
    }
}

食譜.cs

namespace WebApplication.Models
{
    public class Recipe
    {
        [Key]
        public Guid Id { get; set; }
        [Required]
        public string RecipeName { get; set; }
        [Required]
        public string RecipeContent { get; set; }
        public string ApplicationUserId { get; set; }
        public ApplicationUser ApplicationUser { get; set; }
    }
}

ApplicationDbContext.cs

namespace WebApplication.Models
{
    public class ApplicationDbContext : IdentityDbContext
    {
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.Entity<ApplicationUser>().HasMany(e => e.Recipes).WithOne(e => e.ApplicationUser)
                .OnDelete(DeleteBehavior.ClientCascade);


        }

        public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
        {
        }

        public DbSet<Recipe> Recipes { get; set; }
        public DbSet<ApplicationUser> ApplicationUsers { get; set; }
    }
}

用戶控制器.cs

public IActionResult Delete(string id)
{
    var user = _applicationDbContext.Users
                                    .Where(u => u.Id == id).FirstOrDefault();
    return View(user);
}
      
[HttpPost]
public IActionResult Delete(ApplicationUser appuser)
{
    var user = _applicationDbContext.Users
                                    .Where(u => u.Id == appuser.Id).FirstOrDefault();
    _applicationDbContext.Users.Remove(user);
    _applicationDbContext.SaveChanges();

    return RedirectToAction("Index");
}

我一直在尋找一個小時的解決方案,但沒有任何效果。

配置 modulbuilder 似乎是幾乎每個人的解決方案,但肯定對我不起作用。

ClientCascade只會刪除由 DbContext 跟蹤的相關實體,其中如果設置了 EF 來管理 schema, Cascade還會在數據庫中的 FK Constraint 上設置 Delete Orphans。

您需要確保 hte DbContext 正在跟蹤要刪除的相關實體:

var user = _applicationDbContext.Users
    .Include(x => x.Recipies)
    .Where(u => u.Id == appuser.Id)
    .SingleOrDefault();

這可確保 DbContext 了解相關實體,並應在刪除用戶之前刪除這些實體。 您還需要了解可能引用用戶記錄或 FK 的任何其他實體。 例如,如果其他記錄正在跟蹤 CreatedBy 之類的東西,那么這些記錄可能會設置為將 FK 返回給用戶。 在這里依賴ClientCascade可能會出現問題,並且可能不需要級聯刪除,而是選擇軟刪除 model。 (即 ApplicationUser 上的IsActive標志而不是刪除行)

此外,避免使用First方法,除非您期望多行並且特別想要第一行。 這些方法也只能與OrderBy方法結合使用。 如果您期望 1 行,請使用Single 如果您期望 0 或 1 行,請使用SingleOrDefault 這有助於確保任何意外數據 state 導致有意義的異常,而不是默默地做一些意外的事情。

我設法通過更改這一行來解決這個問題: var user = _applicationDbContext.Users.Where(u => u.Id == appuser.Id).FirstOrDefault(); 為此: var user = _userManager.Users.Include(e=>e.Recipes).Where(u => u.Id == appuser.Id).FirstOrDefault();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM