add repository(倉庫) EntityState狀態
倉儲和工作單元模式是用來在數據訪問層和業務邏輯層之間創建一個抽象層。
圖很重要
首先我們先搭建好空的框架,準備基本的結構和一些測試數據。(新建一個項目XEngine)
然後建立model->SysUser, SysRole , SysUserRole
還有安裝ef(為什麽我的一直安裝不上,狗屁電腦)
在建立dal
新建類 XEngineContext.cs
新建類 XEngineInitializer.cs具體(http://www.cnblogs.com/miro/p/4806199.html)
.新建文件夾 Repositories(用來儲存倉庫類)
創建接口 ISysUserRepository
接口中聲明了一組典型的CRUD方法。
IEnumerable<SysUser> GetUsers();
SysUser GetUserBy(int userID);
void InsertUser(SysUser user);
void DeleteUser(int userID);
void UpdateUser(SysUser user);
void Save();
創建對應的倉儲類 SysUserRepository
創建類 SysUserRepository, 實現接口 ISysUserRepository
ef中的EntityState
添加、修改、刪除就是Added、Modified、Deleted
當調用SaveChanges方法的時候,EF會根據EntityState這個枚舉檢測到實體的狀態,然後執行相應的增/刪/改操作。它們的具體意思分別為:
- Detached:對象存在,但未由對象服務跟蹤。在創建實體之後、但將其添加到對象上下文之前,該實體處於此狀態;
- Unchanged:自對象加載到上下文中後,或自上次調用 System.Data.Objects.ObjectContext.SaveChanges() 方法後,此對象尚未經過修改;
- Added:對象已添加到對象上下文,但尚未調用 System.Data.Objects.ObjectContext.SaveChanges() 方法;
- Deleted:使用 System.Data.Objects.ObjectContext.DeleteObject(System.Object) 方法從對象上下文中刪除了對象;
- Modified:對象已更改,但尚未調用 System.Data.Objects.ObjectContext.SaveChanges() 方法。
Controller中使用SysUser倉儲類
我們新建個Controller : UserController
用 List 模板生成視圖。
修改Controller如下:
private IGenericRepository<SysUser> userRepository
= new GenericRepository<SysUser>(new XEngineContext());
public ActionResult Index()
{
var users = userRepository.Get();
return View(users);
}
我們增加了一個抽象層,將數據連接的部分移到Repository中去,這樣實現了Controller和數據層的解耦。
使用 generic repository去除冗余代碼
使用unit of work保證所有repositories使用同一個 context
新建一個unit of work class 用來協調多個repositories工作, 通過創建單一的context讓大家共享。
先解決代碼冗余的問題
仿照ISysUserRepository和SysUserRepository,新建IGenericRepository和GenericRepository(引用TEntity)
通過泛型類已經消除了冗余。
如果有其他實體只需要改變傳入的TEntity就可以了,不需要再重新創建repository class
在DAL文件夾中新建一個類UnitOfWork用來負責context的一致性:
當使用多個repositories時,共享同一個context
我們把使用多個repositories的一系列操作稱為一個 unit of work
當一個unit of work完成時,我們調用context的SaveChanges方法來完成實際的更改。
把 GenericRepository.cs 中的Save 和 Dispose 刪除, 移到UnitOfWork中。
將IGenericRepository 中的IDisposable接口繼承也去掉.
Save & Dispose 的工作統一在UnitOfWork中完成。
修改UserController
private UnitOfWork unitOfWork = new UnitOfWork();
// GET: User
public ActionResult Index()
{
var users = unitOfWork.SysUserRepository.Get(orderBy:q=>q.OrderBy(u=>u.Name));
return View(users);
}
add repository(倉庫) EntityState狀態