がありApplicationUser削除:とき、私、今OptimisticConcurrencyException私は親エンティティを追加することにより、ApplicationUserを拡張しました親
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public DbSet<Master> Masters { get; set; }
}
新しいエンティティに
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の参照を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 = "[email protected]",
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>();
}
私のデータモデルには並行性チェックのメンバーがありません。上記のコードは、親エンティティをApplicationUserエンティティに追加することによって変更された、新しく作成されたMVCアプリケーションからカットアンドペーストされます。
もう1つの注意:この問題を研究するにあたり、数年前に私が見つけたSOのポスト(これは既知のバグであると主張した)を横断して実行しました。親レコード内の何も変更されていないことを確認します。
もう1つの注意:MasterId
外部キーをnullにして、nullを設定してからユーザーを削除しようとしました。助けてくれなかった。この問題は、FKに値があるかどうかに関わらず、ApplicationUser
エンティティに外部キーが存在するように見えます。
質問:なぜあなたは 'UpdateAsync(user)' _after_ 'DeleteAsync(user)'をやっていますか?実際に、なぜあなたは 'Update'を呼びますか? –
@ChrisCurtisいい質問がありました。何らかの理由で 'Delete(user)'が 'context.Users.Remove(user)'のように動作し、 'context.SaveChanges()'を呼び出すまでデータベースに保持されていないことを頭に入れました。あなたが答えとしてあなたのコメントを投稿するほど親切であれば、私はそれを受け入れるでしょう。ありがとう! –
これは明白な疑問を提起します。どのシナリオで 'userManager.Update()'を呼び出す必要がありますか? 「ドキュメント」(「ユーザーを更新する」)はまったく役に立たない。すべてのUserManagerルーチンが変更を永続化しますか?私がApplicationUserエンティティのUserNameプロパティまたはEmailプロパティを変更した場合、DbContext.SaveChanges()を呼び出すことができますか、UserManager.Updateは他の魔法を実行できますか?私はこれが新しいSOの質問のための素晴らしい飼料になると思います... –