0

このコードは正常に動作しますが、作業単位クラス (または更新、削除、追加操作) でストアドプロシージャの実行を実行すると、元のデータを引き続き取得できます。実際、私はすでに解決策を持っています(コントローラーの下に投稿されています)が、これが最もエレガントな方法ではないと確信しています。誰かがコードのリファクタリングを手伝ってくれることを願っています。助けてください。ありがとう

私の仕事の単位

 public class UnitOfWork : IUnitOfWork, IDisposable
 {
   private readonly ObjectContext _context;
   private BookRepository _books;

    public UnitOfWork(ObjectContext context)
    {
        if (context == null)
        {
            throw new ArgumentNullException("Context was not supplied");
        }

        _context = context;
    }

    public IRepository<Book> Books
    {
        get
        {
            if (_books== null)
            {
                _books= new BookRepository (_context);
            }

            return _books;
        }
    }

    public void UpdateAuthor(int id)
    {
        _context.ExecuteStoreCommand("sp_UpdateAuthor @param1", 
            new SqlParameter("param1", id));
     }

     public void Commit()
    {           
       _context.SaveChanges();
    }

ブック リポジトリ

public class BookRepository : Repository<Book>
{
    public BookRepository (ObjectContext context)
        : base(context)
    {
    }

    public override Machine GetById(object id)
    {
        return _objectSet.SingleOrDefault(s => s.Id== (int)id);
    }
}

汎用リポジトリ

public abstract class Repository<T> : IRepository<T>
    where T : class, IAuditEntity
{
    protected IObjectSet<T> _objectSet;

    public Repository(ObjectContext context)
    {
        _objectSet = context.CreateObjectSet<T>();
    }

    public abstract T GetById(object id);

    public IEnumerable<T> GetAll()
    {
        return _objectSet;
    }

    public IEnumerable<T> Query(Expression<Func<T, bool>> filter)
    {
        return _objectSet.Where(filter);
    }

    public void Add(T entity)
    {
        _objectSet.AddObject(entity);
    }

    public void Remove(T entity)
    {            
        _objectSet.DeleteObject(entity); 
    }
  }

コントローラーコード

 public class HomeController : Controller
  {
    private IUnitOfWork _unitOfWork;

    #region Core Action Methods

    public HomeController()
    {
        this._unitOfWork = new UnitOfWork(((IObjectContextAdapter)new BookContext()).ObjectContext);
    }

  private IEnumerable<BookViewModel> GetBookdsViewModels(int id)
    {
        //THE CODE WHERE ITS NOT RETURNING THE UPDATED VLAUES
        //var query = _unitOfWork.Books.GetAll().Where(d => d.Id== id);

        //I WANT TO CHANGE THIS CODE
        ObjectContext objectContext = ((IObjectContextAdapter)new BookContext()).ObjectContext;
        ObjectSet<Book> set = objectContext.CreateObjectSet<Book>();
        set.MergeOption = MergeOption.OverwriteChanges;
        var query = from a in set
                    where a.Id== id && !a.IsDeleted
                    select a;

 return query
            .Select(
            c => new BookViewModel
            {
                Id = c.Id ,
                Name = c.Name
            });
}
4

2 に答える 2

1

問題は、データベースに対して直接実行していて、リポジトリに保存されているローカル コピーを参照しようとしていて、それらが異なるためだと思います。

public void UpdateAuthor(int id)
    {
        _context.ExecuteStoreCommand("sp_UpdateAuthor @param1", 
            new SqlParameter("param1", id));
     }

このクエリを実行すると、ローカルではなくデータベースに変更が加えられます-次のようなことをしないでください:

public void UpdateAuthor(int id)
{
  var book  = Books.GetById(id);
   /* make changes to your book object */
   _unit.Save();
}

ストア プロシージャを使用して変更を加えたい場合は、コンテキストを破棄し、リポジトリを再作成して、ローカル コピーではなく DB からのデータを操作する必要があります。

于 2012-08-07T19:28:55.860 に答える