我正在使用通用存储库和工作单元,不知道为什么它不会检测我对数据库所做的更改。
public abstract class Repository<T> : IRepository<T>
where T : class, IAuditEntity
{
protected IObjectSet<T> _objectSet;
public Repository(ObjectContext context)
{
_objectSet = context.CreateObjectSet<T>();
}
#region IRepository<T> Members
public abstract T GetById(object id);
public IEnumerable<T> GetAll()
{
return _objectSet.Where(e => !e.IsDeleted).OrderByDescending(o => o.ModifiedOn);
}
public IEnumerable<T> Query(Expression<Func<T, bool>> filter)
{
return _objectSet.Where(filter);
}
public void Add(T entity)
{
_objectSet.AddObject(entity);
}
public void Update(T entity)
{
//some code here; not working
//What do I need to put here?
}
public void Remove(T entity)
{
_objectSet.DeleteObject(entity);
}
}
控制器:
[HttpPost]
public ActionResult Edit(Student stud)
{
if (ModelState.IsValid)
{
_unitOfWork.Students.Update(stud);
_unitOfWork.Commit();
return RedirectToAction("Index");
}
return View(stud);
}
之前,我尝试使用此更新我的记录:
[HttpPost]
public ActionResult Edit(Student stud)
{
if (ModelState.IsValid)
{
var i = _unitOfWork.Students.GetById(stud.StudentID);
TryUpdateModel(i);
_unitOfWork.Commit();
return RedirectToAction("Index");
}
return View(stud);
}
当然有效,但我确信这不是正确的方法。只想问一下我需要在我的存储库上运行Update方法需要什么?
答案 0 :(得分:3)
您需要继续引用存储库中的上下文并使用它:
public void Update(T entity)
{
_objectSet.Attach(entity);
_context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}
答案 1 :(得分:1)
这种情况正在发生,因为当Student对象被发布回控制器时,由于HTTP的无状态特性,它不再附加到实体框架上下文。
你从数据库获取记录并修改它的第二种方法很好,但显然需要额外往返数据库。
我通常使用Dbcontext而不是ObjectContext,我相信它实际上是ObjectContext的一个包装器,带有一些额外的功能。我不确定这是否有帮助,但如果您使用DbContext,您将能够做到这一点....
dbContext.Entry(stud).State = EntityState.Modified;
dbContext.SaveChanges();
同样可以通过ObjectContext实现,通过调用AttachTo将返回的Student重新附加回上下文,然后在调用SaveChanges之前将其状态设置为modified。