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 });
}
あなたが見ることができるようにpostService
とuserManager
あり:ここでは、アクションのためのコードです。それらは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.
:
は、ここに私のユーザーマネージャクラスです。私はお勧めすることができ、コードへのアクセスが制限された
ありがとうございました!しかし、すべてが同じdbContextを使用していても、私はuserManagerを通して直接ユーザーのインスタンスを使用することはできません。 –
状況によって異なります。何が起こっているのか、それがあなたに役立つかもしれないことを説明しましょう。完全な文脈が常に良いです。 1.オブジェクトの新しいインスタンスを作成し、それをコンテキストに添付するとき。変更トラッカーはオブジェクト(またはエンティティ)を「追加」状態として追跡しています。すべてのプロパティ(ユーザー)を含む。 2. SaveChanges()が呼び出されたとき。 '投稿'のすべてのnavプロパティも '追加'されています。そのIDを持つユーザーは既に存在していますが、DBに追加しようとしているため、EFは混乱します。 上記の溶液が働いた場合。あなたは親切にそれを「答え」としてマークできますか? –
私は理解していると思いますが、それも存在するカテゴリではなぜ起こりませんか? –