这个问题有很多线程,但大多数似乎是在有人试图循环并保存在 IQueryable 而不是 IList 的上下文中出现的,这不是我正在做的。
我在控制器和存储库之间传递上下文时遇到问题。我在我的应用程序的其他地方遇到了这个问题,但下面是说明和重新创建此问题的简单方法。
首先,我在 Startup.cs 中将我的 DbContext 设置为服务。
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
然后,我有一个控制器,它被注入。当我直接从控制器使用上下文时,前两个保存工作正常,但是当我从 repo 中使用它时,它会出错并出现标题中的异常。请注意,如果我在尝试将记录保存在我的存储库中之前将它保存在控制器中,它只会出错。
private ApplicationDbContext _context;
private UserManager<ApplicationUser> _userManager;
private ApplicationUser _user
{
get
{
return _userManager.GetUserAsync(User).Result;
}
}
public InitiativesController(ApplicationDbContext context, UserManager<ApplicationUser> userManager)
{
_context = context;
_userManager = userManager;
}
// GET: Initiatives
public IActionResult Index()
{
Initiative i2 = new Initiative();
i2.Id = 2;
i2.InitiativeName = "testname";
_context.Update(i2);
_context.SaveChanges(); // Works fine
var i4 = _context.Initiatives.SingleOrDefault(init => init.Id == 2);
i4.InitiativeName = "blep";
_context.Update(i4);
_context.SaveChanges(); // Works fine
InitiativeRepository initiativeRepository = new InitiativeRepository(_context, _user);
var i= initiativeRepository.Get(2);
i.InitiativeName = "blah";
initiativeRepository.Update(i); //Throws exception
var initiatives = initiativeRepository.GetAll();
return View(initiatives);
}
这是存储库类:
public class InitiativeRepository
{
private ApplicationDbContext _context;
private ApplicationUser _user;
public InitiativeRepository(ApplicationDbContext context, ApplicationUser user)
{
_context = context;
_user = user;
}
public Initiative Get(int id, bool eagerLoad = false)
{
if (!eagerLoad)
{
return _context.Initiatives.SingleOrDefault(i => i.Id == id);
}
else
{
return _context.Initiatives.Include(i => i.Tasks).ThenInclude(t => t.ActionItems).
SingleOrDefault(i => i.Id == id);
}
}
public List<Initiative> GetAll()
{
return _context.Initiatives.ToList();
}
public Initiative Update(Initiative Entity)
{
_context.Update(Entity);
_context.SaveChanges(); // This line causes the exception.
return Entity;
}
}
这应该是任何 DB 写入的入口点,但是,我正在使用 ASP.NET 身份并自动登录此会话,所以我不确定它是否也会影响这一点。