0

以下是我的代碼。我想知道它是真的還是不是。使用實體框架的存儲庫模式

public interface IRepository<T> : IDisposable 
{ 
    IQueryable<T> GetAll(); 
    T Update(T entity); 
    T Insert(T entity); 
    T GetById(T entity); 
    void Delete(T entity); 
    void Save(); 
} 

public class Repository<T> : IRepository<T> where T : class 
{ 
    private readonly SchoolDBEntities _context; 

    public Repository(SchoolDBEntities context) 
    { 
     _context = context; 
    } 

    public IQueryable<T> GetAll() 
    { 
     return _context.Set<T>(); 
    } 

    public T Update(T entity) 
    { 
     var result = _context.Set<T>().Attach(entity); 
     _context.Entry(entity).State = EntityState.Modified; 
     return result; 
    } 

    public T Insert(T entity) 
    { 
     return _context.Set<T>().Add(entity); 
    } 

    public T GetById(T entity) 
    { 
     return _context.Set<T>().Find(entity); 
    } 

    public void Delete(T entity) 
    { 
     _context.Set<T>().Remove(entity); 
    } 

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

    public void Dispose() 
    { 
     _context.Dispose(); 
    } 
} 

的問題是,我不知道何時何地撥打SaveDispose方法。

回答

2

不要做IRepository<T>

處置嘗試這樣

public interface IUnitOfWork : IDisposable 
{ 
    IRepository<Cart> CartRepository { get; } 
    IRepository<Product> ProductRepository { get; } 
    void Save(); 
} 

public class UnitOfWork : IUnitOfWork 
{ 
    readonly SqlDbContext _context; 
    public UnitOfWork() 
    { 
     _context = new SqlDbContext(); 
    } 

    private bool _disposed; 
    protected virtual void Dispose(bool disposing) 
    { 
     if (!_disposed) 
     { 
      if (disposing) 
      { 
       _context.Dispose(); 
      } 
     } 
     _disposed = true; 
    } 
    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

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

    public IGenericRepository<Cart> CartRepository 
    { 
     get { return new Repository<Cart>(_context); } 
    } 

    public IGenericRepository<User> UserRepository 
    { 
     get { return new Repository<User>(_context); } 
    } 
} 

的UnitOfWork模式你可以這樣調用

using (_unitOfWork) 
{ 
    var p = _unitOfWork.ProductRepository.SingleOrDefault(p => p.Id == productId); 
    _cartRepository.Add(p); 
    _unitOfWork.Save(); 
} 
+0

有什麼好處?我可以在存儲庫中編寫這些代碼 – samira

+2

通常,您將遇到需要從2個或更多存儲庫調用方法的場景。所以,你將不得不使用(_cartRepository){}'和'using(_productRepository){}',這裏基本上你打開和關閉了數據庫連接兩次,這可以避免使用UnitOfWork模式,像這樣'using(_unitOfWork ) { var p = _unitOfWork.ProductRepository.SingleOrDefault(p => p.Id == productId); _cartRepository.Add(p); _unitOfWork.Save(); }' – sunil

+0

您的評論應該是答案的一部分,以在您的答案背後添加推理。 – maulik13

0

我認爲這取決於你使用這個回購的方式。 因此,當你想保存和處理時,當你想完成你的工作...在應用程序關閉等。

0

因爲你在這裏使用Unit of Work模式,顯然你應該調用保存方法,如果用戶)發送保存更改命令。它可能是一個人點擊您的編輯表單或應用程序的其他部分中的應用更改按鈕,該部分處理某些事務邏輯並基於此保存/放棄更改。所以基本上,當邏輯變更集準備好保存時,Repository負責處理它。