我正在尝试创建一个ASP.NET MVC项目。
我有一个SubmitPost
动作的论坛控制器。以下是操作的代码:
[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 - 每个请求范围。登录,按预期注册所有工作。
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();
}
邮政服务只做这件事:
public void Submit(Post post)
{
this.context.Posts.Add(post);
this.context.SaveChanges();
}
我的问题是,当调用该动作时,我得到一个异常:
An entity object cannot be referenced by multiple instances of IEntityChangeTracker.
在这一行:
this.context.Posts.Add(post);
我很确定我只为服务和userManager提供了一个dbContext实例。当我使用null
作者插入帖子时,它可以正常工作。我想EF正在尝试再次保存现有用户,但我没有得到同样的错误,该类别也来自外部服务并且已经存在。我尝试在MyDbContext
的构造函数上设置一个断点,它只调用一次。也许有一些我不了解的关于UserManager的具体内容?
这是我的用户管理员课程:
public class ApplicationUserManager : UserManager<ApplicationUser>
{
public ApplicationUserManager(IUserStore<ApplicationUser> store)
: base(store)
{
// Validation configs etc.
我不知道究竟是什么导致了异常,所以任何想法都会有所帮助。
答案 0 :(得分:0)
由于对代码的访问权限有限,我只能建议:
对象Post
上的创建属性AuthorId
然后改变
var user = this.userManager.FindById(this.User.Identity.GetUserId());
this.postService.Submit(new Post
{
Title = model.Title,
Content = model.Content,
Category = category,
Author = user,
});
到
var userId = this.User.Identity.GetUserId();
this.postService.Submit(new Post
{
Title = model.Title,
Content = model.Content,
Category = category,
AuthorId = userId,
});
如果上述方法不起作用,请在课程Post
上使用Author
ForeignKey(nameof(AuthorId))
这是我现在可以提供的所有信息,而无需更多信息。我希望它有所帮助