![](/img/trans.png)
[英]Querying related entities with Eager & Explicit loading it doesn't work in EF for ASP.NET MVC CORE
[英]Cascade Delete doesn't work in Asp.net 5 and EF Core
我正在嘗試從數據庫中刪除User
, User
有自己的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.