爲了解耦領域層與數據映射層的關係。數據庫
倉儲模式最大的優勢就是全部的數據訪問首先是經過倉庫的,對倉庫的增刪改都不會當即提交到數據庫,而只有當調用了倉庫包裹器,這些增刪改的操做纔會一次提交到數據庫。設計
博客園有不少例子,這裏不一一例舉。code
由於EF自己便是按照repository來設計的。請看下面這行代碼:
var db = new DemoDbContext();
這裏的db即至關因而repository的包裹器。經過包裹器能夠很是輕鬆的訪問到其下的每個repository,這也絕對是最簡單的訪問方式了,如:orm
db.Users.... db.Products...
本身實現的repository還要經過IOC。繼承
在EF中,DbSet
Northwind裏其實也有倉儲,只不過經過EF的Repository進行實現。ip
INorthwindDbContext接口定義了倉庫,以下:get
public interface INorthwindDbContext { DbSet<Category> Categories { get; set; } DbSet<Customer> Customers { get; set; } DbSet<Employee> Employees { get; set; } DbSet<EmployeeTerritory> EmployeeTerritories { get; set; } DbSet<OrderDetail> OrderDetails { get; set; } DbSet<Order> Orders { get; set; } DbSet<Product> Products { get; set; } DbSet<Region> Region { get; set; } DbSet<Shipper> Shippers { get; set; } DbSet<Supplier> Suppliers { get; set; } DbSet<Territory> Territories { get; set; } DbSet<User> Users { get; set; } Task<int> SaveChangesAsync(CancellationToken cancellationToken); }
a. 增,刪操做。博客
_context.Customers.Add(entity); _context.Customers.Remove(entity);
b. 改操做,改經過根據ID查詢出來,將最新請求的request 進行逐個賦值。可是這很難達到通用性,之後每一個倉庫都須要進行相似Address,City,Company...的更改。it
var entity = await _context.Customers .SingleOrDefaultAsync(c => c.CustomerId == request.Id, cancellationToken); entity.Address = request.Address; entity.City = request.City; entity.CompanyName = request.CompanyName; entity.ContactName = request.ContactName; entity.ContactTitle = request.ContactTitle; entity.Country = request.Country; entity.Fax = request.Fax; entity.Phone = request.Phone; entity.PostalCode = request.PostalCode;
c. 查操做
var entity = await _context.Customers .FindAsync(request.Id);
d. 一塊兒提交操做
e. 倉庫包裹器提交數據庫
_context.SaveChangesAsync(cancellationToken);
用EF作倉庫的缺點
1.沒法解耦ORM;
2.更改數據的時候須要對每一個倉庫的字段進行一一對應。
QQ羣技術討論:20120449