2013-03-01 2 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); 
    } 

Конечно, это работает, но я уверен, что это не правильный способ сделай это. Просто спросите, что мне нужно, чтобы сделать метод Update в моем репозитории? Любая помощь?

Благодаря

ответ

3

Вы должны иметь ссылку на контекст в вашем хранилище и использовать это:

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

Это происходит потому, что, когда объект Student будет размещена на контроллер он больше не прилагается к контексту инфраструктуры сущности из-за безгражданности HTTP.

Ваш второй подход к получению записи из базы данных и ее модификация хорош, но, очевидно, предполагает дополнительную поездку туда и обратно в базу данных.

Обычно я использую Dbcontext, а не ObjectContext, который, как я считаю, является оберткой вокруг ObjectContext с некоторыми дополнительными функциями. Я не уверен, если это поможет или нет, но если бы вы использовали DbContext вы могли бы сделать это ....

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

То же самое может быть достигнуто через ObjectContext по телефону AttachTo повторно прикрепить возвращенный ученик обратно в контекст, а затем установите его состояние для изменения до вызова SaveChanges.

Смежные вопросы