[英]OptimisticConcurrencyException when deleting an ApplicationUser that has a parent
我通過添加父實體擴展了ApplicationUser:
public class ApplicationUser : IdentityUser
{
public int MasterId { get; set; }
public virtual Master Master { get; set; }
}
public class Master
{
public int Id { get; set; }
public string Name { get; set; }
}
以及相關的DbContext引用新實體
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<Master> Masters { get; set; }
}
現在,當我嘗試刪除ApplicationUser時, userManager.UpdateAsync()
會拋出OptimisticConcurrencyException
。
public class HomeController : Controller
{
public async Task<ActionResult> Index()
{
// Get the DbContext and UserManager out of the OWIN pipeline
var db = GetDbContext(this);
var userManager = GetUserManager(this);
// Create a Master record if necessary
if (db.Masters.Count() == 0) {
db.Masters.Add(new Master { Name = "The Master" });
await db.SaveChangesAsync();
}
var masterId = (from m in db.Masters select m.Id).First();
// Create a new ApplicationUser
var user = new ApplicationUser {
UserName = "Bob",
Email = "abc@abc.com",
MasterId = masterId
};
await userManager.CreateAsync(user, "Password123?");
await userManager.UpdateAsync(user);
// Try to delete the ApplicationUser
user = (from u in db.Users select u).First();
await userManager.DeleteAsync(user);
await userManager.UpdateAsync(user); // Throws OptimisticConcurrencyException
return View();
}
public static ApplicationDbContext GetDbContext(Controller controller)
{
return controller.HttpContext.GetOwinContext()
.Get<ApplicationDbContext>();
}
public static ApplicationUserManager GetUserManager(Controller controller)
{
return controller.HttpContext.GetOwinContext()
.GetUserManager<ApplicationUserManager>();
}
重申一下,我的數據模型沒有並發檢查成員。 上面的代碼是從新創建的MVC應用程序中剪切並粘貼的,我通過向ApplicationUser實體添加父實體來修改該應用程序。
另一個注意事項:在研究這個問題時,幾年前我遇到了SO帖子(我現在找不到),聲稱這是一個已知的bug,因為當它試圖更新相關記錄並看到沒有(在父記錄中)已經改變。
另一個注意事項:我嘗試使MasterId
外鍵可以為空,並在嘗試刪除用戶之前將其設置為null。 沒有幫助。 問題似乎是ApplicationUser
實體中存在外鍵,無論FK是否具有值。
不需要調用UpdateAsync(user)
,並且可能會在DeleteAsync(user)
之后導致您的問題,因為用戶已被刪除。 刪除更新調用,你應該是好的
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.