2016-05-04 4 views
0

があり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エンティティに外部キーが存在するように見えます。

+0

質問:なぜあなたは 'UpdateAsync(user)' _after_ 'DeleteAsync(user)'をやっていますか?実際に、なぜあなたは 'Update'を呼びますか? –

+0

@ChrisCurtisいい質問がありました。何らかの理由で 'Delete(user)'が 'context.Users.Remove(user)'のように動作し、 'context.SaveChanges()'を呼び出すまでデータベースに保持されていないことを頭に入れました。あなたが答えとしてあなたのコメントを投稿するほど親切であれば、私はそれを受け入れるでしょう。ありがとう! –

+0

これは明白な疑問を提起します。どのシナリオで 'userManager.Update()'を呼び出す必要がありますか? 「ドキュメント」(「ユーザーを更新する」)はまったく役に立たない。すべてのUserManagerルーチンが変更を永続化しますか?私がApplicationUserエンティティのUserNameプロパティまたはEmailプロパティを変更した場合、DbContext.SaveChanges()を呼び出すことができますか、UserManager.Updateは他の魔法を実行できますか?私はこれが新しいSOの質問のための素晴らしい飼料になると思います... –

答えて

0

UpdateAsync(user)への呼び出しは不要で、ユーザーが削除されているためDeleteAsync(user)の後に問題が発生している可能性があります。更新の呼び出しを削除して、あなたは良いはずです

+0

OPが要求したようにしていました。私はそれをもっと答えに変えよう –

関連する問題