我将使用实体框架和ASP.NET MVC应用程序将一个博客插入到我的数据库中。如果我想将实体添加到上下文中,则我在下面的代码的最后一行出现了此错误。通过插入数据库引用多个实例的实体使用EF
InvalidOperationException
:的实体对象不能由IEntityChangeTracker
多个实例被引用。
这里是我的代码:
public class AdminController : Controller
{
[HttpPost]
public ActionResult CreateBlog(BlogViewModel vm)
{
try
{
_blogService.Insert(new Blog()
{
Titel = vm.Titel,
Beschrijving = vm.Beschrijving,
Content = (vm.Actie.ToLower() == "publiceer" ? true : false),
Verwijderd = false,
Auteur = UserManager.FindById(User.Identity.GetUserId())
});
}
catch (Exception ex)
{
Console.Write(ex.Message);
}
return RedirectToAction(nameof(Blog));
}
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
}
private set
{
_userManager = value;
}
}
public AdminController(ApplicationUserManager userManager, IBlogService blog)
{
UserManager = userManager;
_blogService = blog;
}
}
public class BlogService : IBlogService
{
public void Insert(Blog blog)
{
_blogRepo.Insert(blog);
_blogRepo.SaveChanges();
}
}
public class BlogRepo : GenericRepo<Blog>
{
public override Blog Insert(Blog blog)
{
context.Entry(blog.Auteur).State = EntityState.Unchanged;
return dbSet.Add(blog); // --> on this line
}
}
你能找到我,我做了什么问题?提前致谢。
做你的UserManager和你blogService共享相同的DbContext。如果不是那么用户拥有2个上下文。 – tschmit007
每个请求应该只有一个上下文实例。将其定义为控制器上的私有字段,并手动将其注入到'UserManager'和'BlogService'实例中,或使用依赖注入容器来管理生命周期和注入。 –
@ tschmit007:否每次只有一个'dbContext'。 –