Generic repository pattern and Unit of work with Entity framework
原文 Generic repository pattern and Unit of work with Entity framework
Repository pattern is an abstraction layer between your business logic layer and data access layer. This abstract layer contains methods to server data from data layer to business layer. Now, changes in your data layer cannot affect the business layer directly.
For more information about repository pattern or unit of work visit this article. Below is my approach how to implement repository pattern and unit of work with entity framework.
1. Create IGenericRepository interface
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
public interface IGenericRepository<TEntity>{ /// <summary> /// Get all entities from db /// </summary> /// <param name="filter"></param> /// <param name="orderBy"></param> /// <param name="includes"></param> /// <returns></returns> List<TEntity> Get( Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, params Expression<Func<TEntity, object>>[] includes); /// <summary> /// Get query for entity /// </summary> /// <param name="filter"></param> /// <param name="orderBy"></param> /// <returns></returns> IQueryable<TEntity> Query(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null); /// <summary> /// Get single entity by primary key /// </summary> /// <param name="id"></param> /// <returns></returns> TEntity GetById(object id); /// <summary> /// Get first or default entity by filter /// </summary> /// <param name="filter"></param> /// <param name="includes"></param> /// <returns></returns> TEntity GetFirstOrDefault( Expression<Func<TEntity, bool>> filter = null, params Expression<Func<TEntity, object>>[] includes); /// <summary> /// Insert entity to db /// </summary> /// <param name="entity"></param> void Insert(TEntity entity); /// <summary> /// Update entity in db /// </summary> /// <param name="entity"></param> void Update(TEntity entity); /// <summary> /// Delete entity from db by primary key /// </summary> /// <param name="id"></param> void Delete(object id);} |
2. Create GenericRepository class to implement interface
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
public class GenericRepository<TEntity> : IGenericRepository<TEntity> where TEntity : class{ private DbContext context; private DbSet<TEntity> dbSet; public GenericRepository(DbContext context) { this.context = context; this.dbSet = context.Set<TEntity>(); } public virtual List<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, params Expression<Func<TEntity, object>>[] includes) { IQueryable<TEntity> query = dbSet; foreach (Expression<Func<TEntity, object>> include in includes) query = query.Include(include); if (filter != null) query = query.Where(filter); if (orderBy != null) query = orderBy(query); return query.ToList(); } public virtual IQueryable<TEntity> Query(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null) { IQueryable<TEntity> query = dbSet; if (filter != null) query = query.Where(filter); if (orderBy != null) query = orderBy(query); return query; } public virtual TEntity GetById(object id) { return dbSet.Find(id); } public virtual TEntity GetFirstOrDefault(Expression<Func<TEntity, bool>> filter = null, params Expression<Func<TEntity, object>>[] includes) { IQueryable<TEntity> query = dbSet; foreach (Expression<Func<TEntity, object>> include in includes) query = query.Include(include); return query.FirstOrDefault(filter); } public virtual void Insert(TEntity entity) { dbSet.Add(entity); } public virtual void Update(TEntity entity) { dbSet.Attach(entity); context.Entry(entity).State = EntityState.Modified; } public virtual void Delete(object id) { TEntity entityToDelete = dbSet.Find(id); if (context.Entry(entityToDelete).State == EntityState.Detached) { dbSet.Attach(entityToDelete); } dbSet.Remove(entityToDelete); }} |
3. Create IUnitOfWork interface
|
1
2
3
4
5
|
public interface IUnitOfWork{ IGenericRepository<Model> ModelRepository { get; } void Save();} |
4. Create UnitOfWork class to implement interface
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public class UnitOfWork : IUnitOfWork, System.IDisposable{ private readonly MyDatabaseContext _context; private IGenericRepository<Model> _modelRepository; public UnitOfWork(MyDatabaseContext context) { _context = context; } public IGenericRepository<Model> ModelRepository { get { return _modelRepository ?? (_modelRepository = new GenericRepository<Model>(_context)); } } public void Save() { _context.SaveChanges(); } private bool disposed = false; protected virtual void Dispose(bool disposing) { if (!this.disposed) { if (disposing) { _context.Dispose(); } } this.disposed = true; } public void Dispose() { Dispose(true); System.GC.SuppressFinalize(this); }} |
5. Usage in controller
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
public class HomeController : Controller{ private IUnitOfWork _unitOfWork; public HomeController(IUnitOfWork unitOfWork) { _unitOfWork = unitOfWork; } // // GET: /Home/ public ActionResult Index() { // get all models (all properties) List<Model> modelList = _unitOfWork.ModelRepository.Get(m => m.FirstName == "Jan" || m.LastName == "Holinka", includeProperties: "Account"); // get all models (some properties) List<ModelDto> modelDtoList = _unitOfWork.UserRepository .Query(x => x.FirstName == "Jan" || x.LastName == "Holinka") .Select(x => new ModelDto { FirstName = x.FirstName, LastName = x.LastName }) .ToList(); return View("Index"); } // show list of models in view return View(modelList); }}public class ModelDto{ public string FirstName { get; set; } public string LastName { get; set; }} |
That's all.
Generic repository pattern and Unit of work with Entity framework的更多相关文章
- Using the Repository Pattern with ASP.NET MVC and Entity Framework
原文:http://www.codeguru.com/csharp/.net/net_asp/mvc/using-the-repository-pattern-with-asp.net-mvc-and ...
- [转]Using the Repository Pattern with ASP.NET MVC and Entity Framework
本文转自:http://www.codeguru.com/csharp/.net/net_asp/mvc/using-the-repository-pattern-with-asp.net-mvc-a ...
- Follow me to learn what is repository pattern
Introduction Creating a generic repository pattern in an mvc application with entity framework is th ...
- [转]Upgrading to Async with Entity Framework, MVC, OData AsyncEntitySetController, Kendo UI, Glimpse & Generic Unit of Work Repository Framework v2.0
本文转自:http://www.tuicool.com/articles/BBVr6z Thanks to everyone for allowing us to give back to the . ...
- Asp.net webform scaffolding结合Generic Unit of Work & (Extensible) Repositories Framework代码生成向导
Asp.net webform scaffolding结合Generic Unit of Work & (Extensible) Repositories Framework代码生成向导 在上 ...
- Using Repository Pattern in Entity Framework
One of the most common pattern is followed in the world of Entity Framework is “Repository Pattern”. ...
- Laravel与Repository Pattern(仓库模式)
为什么要学习Repository Pattern(仓库模式) Repository 模式主要思想是建立一个数据操作代理层,把controller里的数据操作剥离出来,这样做有几个好处: 把数据处理逻辑 ...
- 在Entity Framework 4.0中使用 Repository 和 Unit of Work 模式
[原文地址]Using Repository and Unit of Work patterns with Entity Framework 4.0 [原文发表日期] 16 June 09 04:08 ...
- Using StructureMap DI and Generic Repository
In this post, i will show how to use generic repository and dependency injection using structuremap. ...
随机推荐
- 仿UC天气下拉和微信下拉眼睛头部淡入淡出--第三方开源--PullLayout
Android-PullLayout是github上的一个第三方开源项目,该项目主页是:https://github.com/BlueMor/Android-PullLayout 原作者项目意图实现类 ...
- ActiveMQ之MessageListener
消息的消费者接收消息可以采用两种方式: 1.consumer.receive()或 consumer.receive(int timeout); 2.注册一个MessageListener. 采用第一 ...
- 提高SQL语句的性能
一.FROM子句中的表 FROM子表的安排或次序对性能有很大的影响,把较小的表放在前面,把较大的表放在后面,可以得到更高的效率. 二.WHERE子句中的次序 一般来自基表的字段放在结合操作的右侧,要被 ...
- str_replace使用array替换
<?php //替换采集等通过url参数传值 function admin_ff_url_repalce($xmlurl,$order='asc'){ if($order=='asc'){ re ...
- CentOS 6.0 设置IP地址、网关、DNS
切忌: 在做任何操作之前先备份原文件,我们约定备份文件的名称为:源文件名称+bak,例如原文件名称为:centos.txt 那么备份文件名称为:centos.txtbak 引言:linux ...
- EntityFramework中的datetime2异常的解决
(转) 最近使用.net的Entity Framework构建网站数据层,给一个实体的DATETIME类型的属性赋值时 突然莫名奇妙显示有一个类型不匹配的异常如下: System.Data.Sql ...
- 深入理解用mysql_fetch_row()以数组的形式返回查询结果
同mysql_result()一样,mysql_fetch_row()也可以用来获取查询结果集,其区别在于函数的返回值不是一个字符串,而是一个数组.函数定义如下. 复制代码 代码如下: array m ...
- 微软职位内部推荐-Senior SDE for Windows App Experience
微软近期Open的职位: Job posting title: Senior Software Development Engineer Location: China, Beijing Divisi ...
- linux下MySQL 5.6源码安装
linux下MySQL 5.6源码安装 1.下载:当前mysql版本到了5.6.20 http://dev.mysql.com/downloads/mysql 选择Source Code 2.必要软件 ...
- 使用highcharts 绘制Web图表
问题描述: 使用highcharts 绘制Web图表 Highcharts说明: 问题解决: (1)安装Highcharts 在这些图表中,数据源是一个典型的JavaScrip ...