删除具有父级的ApplicationUser时的OptimisticConcurrencyException

时间:2016-05-04 18:22:50

标签: c# entity-framework asp.net-identity

我通过添加父实体扩展了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是否有值。

1 个答案:

答案 0 :(得分:0)

不需要调用UpdateAsync(user),因为用户已被删除,可能会在DeleteAsync(user)之后导致您的问题。删除更新调用,你应该是好的