3

汎用リポジトリと作業単位を使用していますが、データベースに加えた変更が検出されない理由がわかりません。

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 メソッドを機能させるには何が必要ですか?

4

2 に答える 2

3

リポジトリ内のコンテキストへの参照を保持し、これを使用する必要があります。

public void Update(T entity)
{
   _objectSet.Attach(entity);
   _context.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
}
于 2013-03-01T12:13:58.260 に答える
1

これは、Student オブジェクトがコントローラーにポストバックされると、HTTP のステートレスな性質によりエンティティ フレームワーク コンテキストにアタッチされなくなるために発生します。

DB からレコードを取得して変更する 2 番目のアプローチは問題ありませんが、明らかにデータベースへの余分な往復が必要です。

私は通常、ObjectContext ではなく Dbcontext を使用します。これは、基本的に、いくつかの追加機能を備えた ObjectContext のラッパーです。これが役立つかどうかはわかりませんが、DbContext を使用する場合は、これを行うことができます....

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

AttachTo を呼び出して返された Student をコンテキストに再アタッチし、SaveChanges を呼び出す前にその状態を変更済みに設定することで、ObjectContext を介して同じことを実現できます。

于 2013-03-01T12:17:58.297 に答える