簡體   English   中英

刪除具有父級的ApplicationUser時的OptimisticConcurrencyException

[英]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.

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