2013-03-01 36 views
3

我希望有人可以帮我解决我的这个问题: 即时通讯使用通用的存储库和工作单元,不知道为什么它不会检测到我对数据库所做的更改。EF不会检测到更改

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); 
    } 

当然它的工作原理,但我可以肯定,这是不正确的方法做到这一点。只是想问我需要什么来使我的存储库上的更新方法工作?任何帮助?

感谢

回答

3

你需要保持参照上下文在你的仓库,并使用此:

public void Update(T entity) 
{ 
    _objectSet.Attach(entity); 
    _context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified); 
} 
1

发生这种情况,因为当学生对象被调回控制器它不再连接由于HTTP的无状态特性而导致实体框架上下文。

从数据库获取记录并修改它的第二种方法很好,但显然涉及到数据库的额外往返。

我通常使用Dbcontext而不是ObjectContext,我相信它基本上是ObjectContext的一个包装器,具有一些额外的功能。我不知道这是否有助于或没有,但如果你使用的DbContext你就可以做到这一点....

dbContext.Entry(stud).State = EntityState.Modified; 
dbContext.SaveChanges(); 

同样可以通过ObjectContext的调用AttachTo来实现重新连接返回的学生回到上下文,然后在调用SaveChanges之前将其状态设置为已修改。