新实体中的身份用户

时间:2017-10-06 21:54:38

标签: c# asp.net asp.net-mvc entity-framework

我正在尝试创建一个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 });
}

如您所见,有postServiceuserManager。它们由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.

我不知道究竟是什么导致了异常,所以任何想法都会有所帮助。

1 个答案:

答案 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))

这是我现在可以提供的所有信息,而无需更多信息。我希望它有所帮助