为了解耦领域层与数据映射层的关系。数据库
仓储模式最大的优势就是全部的数据访问首先是经过仓库的,对仓库的增删改都不会当即提交到数据库,而只有当调用了仓库包裹器,这些增删改的操做才会一次提交到数据库。设计
博客园有不少例子,这里不一一例举。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