2017-10-06 10 views
0

ASP.NET MVCプロジェクトを作成しようとしています。 私はSubmitPostアクションのフォーラムコントローラを持っています。新しいエンティティのユーザーID

[HttpPost] 
[Authorize] 
[ValidateAntiForgeryToken] 
public ActionResult Submit(PostSubmitViewModel model) 
{ 
    if (!this.ModelState.IsValid) 
    { 
     return View(model); 
    } 

    var category = this.categoryService.GetById(model.CategoryId); 
    var user = this.userManager.FindById(this.User.Identity.GetUserId()); 

    this.postService.Submit(new Post 
    { 
     Title = model.Title, 
     Content = model.Content, 
     Category = category, 
     Author = user, 
    }); 
    return RedirectToAction("Category", "Forum", new { id = model.CategoryId }); 
} 

あなたが見ることができるようにpostServiceuserManagerあり:ここでは、アクションのためのコードです。それらはNinjectによって注入され、両方とも同じDbContext - per requestスコープを使用します。ログイン、すべての仕事を期待どおりに登録する。この行で

An entity object cannot be referenced by multiple instances of IEntityChangeTracker.

public void Submit(Post post) 
{ 
    this.context.Posts.Add(post); 
    this.context.SaveChanges(); 
} 

私の問題は、アクションが呼び出されたとき、私は例外を取得することである:ポストサービスはこれだけん

private static void RegisterServices(IKernel kernel) 
{ 
    kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope(); 

    // Identity bindings 
    kernel.Bind<IUserStore<ApplicationUser>>().To<UserStore<ApplicationUser>>().InRequestScope() 
     .WithConstructorArgument<DbContext>(kernel.Get<ApplicationDbContext>()); 
    kernel.Bind<IAuthenticationManager>().ToMethod(c => HttpContext.Current.GetOwinContext().Authentication).InRequestScope(); 
    kernel.Bind<ApplicationUserManager>().ToSelf().InRequestScope(); 
    kernel.Bind<ApplicationSignInManager>().ToSelf().InRequestScope(); 
} 

this.context.Posts.Add(post); 

私は、serviceとuserManagerの両方に対してdbContextインスタンスが1つしかないとは確信しています。 nullの投稿を投稿すると、うまく動作します。私はEFが既存のユーザーを再び保存しようとしていると思いますが、外部サービスから来ているカテゴリでも同じエラーが発生せず、すでに存在しています。私はMyDbContextのコンストラクタにブレークポイントを入れようとしましたが、それは一度しか呼び出されません。たぶん私が知りませんUserManagerの具体的な何かがありますか?私はまさにそうどんなアイデアが参考になる例外を発生させているもの見当がつかない

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public ApplicationUserManager(IUserStore<ApplicationUser> store) 
     : base(store) 
    { 
     // Validation configs etc. 

は、ここに私のユーザーマネージャクラスです。私はお勧めすることができ、コードへのアクセスが制限された

答えて

0

:オブジェクトPost

は場合

var userId = this.User.Identity.GetUserId(); 

this.postService.Submit(new Post 
{ 
    Title = model.Title, 
    Content = model.Content, 
    Category = category, 
    AuthorId = userId, 
}); 

var user = this.userManager.FindById(this.User.Identity.GetUserId()); 

this.postService.Submit(new Post 
{ 
    Title = model.Title, 
    Content = model.Content, 
    Category = category, 
    Author = user, 
}); 

を変更するとAuthorId

プロパティを作成します上記のクラスでは動作しませんPostプロパティをAuthorで飾るForeignKey(nameof(AuthorId))

これは私が今できる情報はありません。役に立ったら嬉しいです

+0

ありがとうございました!しかし、すべてが同じdbContextを使用していても、私はuserManagerを通して直接ユーザーのインスタンスを使用することはできません。 –

+0

状況によって異なります。何が起こっているのか、それがあなたに役立つかもしれないことを説明しましょう。完全な文脈が常に良いです。 1.オブジェクトの新しいインスタンスを作成し、それをコンテキストに添付するとき。変更トラッカーはオブジェクト(またはエンティティ)を「追加」状態として追跡しています。すべてのプロパティ(ユーザー)を含む。 2. SaveChanges()が呼び出されたとき。 '投稿'のすべてのnavプロパティも '追加'されています。そのIDを持つユーザーは既に存在していますが、DBに追加しようとしているため、EFは混乱します。 上記の溶液が働いた場合。あなたは親切にそれを「答え」としてマークできますか? –

+0

私は理解していると思いますが、それも存在するカテゴリではなぜ起こりませんか? –

関連する問題