MVC+Ef项目(2) 如何更改项目的生成顺序;数据库访问层Repository仓储层的实现
我们现在先来看看数据库的生成顺序
居然是 Idal层排在第一,而 web层在第二,model层反而在第三 了
我们需要把 coomon 公用层放在第一,Model层放在第二,接下来是 Idal层,dal层,然后是bll层,最后是 web层,这个顺序怎么调整呢?
点击旁边的依赖项.
分别把每个项目所依赖的项目都勾选上,最后点击确认后,我们看看生成顺序.
这样,当我们生成 web层的时候,会自动从上到下生成 common,model,idal,dal,bll层.
我们对web层进行生成一下,顺便打开输出列表,就能看到所有项目的生成顺序已经调整成我们想要的顺序了
下面开始今天的,数据库访问层 Repository的实现,回顾上次结束时候的项目如下图所示.
我们今天的任务就是对 Repository 层的实现 ,这一层是继承接口 IRepository的,所以IRepository层的每个接口,我们都需要在Repository层来实现
(1)我们在数据库访问层(YouJiao.MvcWeb.Repository) 下面添加ProductRepository.cs(产品仓储),UserInfoRepository.cs(用户仓储),这些功能是为了实现对数据库的操作,也就是增删改查,我们先实现 ProductRepository.cs , 这个需要实现接口 IProductRepository , 代码如下
public class ProductRepository : IProductRepository
{
private ModelContainer db = new ModelContainer(); //获取EF上下文的实例 public IList<Product> LoadEneities(Func<Product, bool> whereLambda)
{
return db.Product.Where(whereLambda).ToList();
} public IList<Product> LoadPageEneities<S>(int pageSize, int pageIndex, out int total,
Func<Product, bool> whereLambda, Func<Product, S> orderbyLambda, bool isAsc)
{
var tempList = db.Product.Where(whereLambda).ToList();
total = tempList.Count;
if (isAsc) //如果是升序
{
tempList = tempList.OrderBy<Product,S>(orderbyLambda)
.Skip(pageIndex * pageSize - 1) //越过多少条
.Take(pageSize).ToList(); //取出多少条
}
else
{
tempList = tempList.OrderByDescending<Product, S>(orderbyLambda)
.Skip(pageIndex * pageSize - 1)
.Take(pageSize).ToList();
}
return tempList;
} public Product AddEntity(Product model)
{
db.Product.AddObject(model);
db.SaveChanges();
return model;
} public bool DeleteEntity(Product model)
{
db.Product.Attach(model);
db.ObjectStateManager.ChangeObjectState(model, EntityState.Deleted);
return db.SaveChanges()>0;
} public bool UpdateEntity(Product model)
{
db.Product.Attach(model);
db.ObjectStateManager.ChangeObjectState(model, EntityState.Modified);
return db.SaveChanges() > 0;
}
}
OK ProductRepository(产品仓储)的实现完毕,接下来是UserInfoRepository (用户仓储)
注意了,这里会有一个问题,我们的产品仓储和用户仓储都会用到数据库的操作(增删改查),那么我们怎么办呢,想必这里大家已经清楚该怎么办了,当我们遇到公共的东西的时候我们最好能够抽象出来实现一个固定的功能的基类,然后我们只对其进行继承操作。
我们抽象出一个 BaseRepository (基仓储)
public class BaseRepository<T> where T : class // 这里约束泛型T必须是个类
{
private ModelContainer db = new ModelContainer(); //获取EF上下文的实例 public IList<T> LoadEneities(Func<T, bool> whereLambda)
{
return db.CreateObjectSet<T>().Where(whereLambda).ToList();
} public IList<T> LoadPageEneities<S>(int pageSize, int pageIndex, out int total,
Func<T, bool> whereLambda, Func<T, S> orderbyLambda, bool isAsc)
{
var tempList = db.CreateObjectSet<T>().Where(whereLambda).ToList();
total = tempList.Count;
if (isAsc) //如果是升序
{
tempList = tempList.OrderBy(orderbyLambda)
.Skip(pageIndex * pageSize - 1) //越过多少条
.Take(pageSize).ToList(); //取出多少条
}
else
{
tempList = tempList.OrderByDescending(orderbyLambda)
.Skip(pageIndex * pageSize - 1)
.Take(pageSize).ToList();
}
return tempList;
} public T AddEntity(T model)
{
db.CreateObjectSet<T>().AddObject(model);
db.SaveChanges();
return model;
} public bool DeleteEntity(T model)
{
db.CreateObjectSet<T>().Attach(model);
db.ObjectStateManager.ChangeObjectState(model, EntityState.Deleted);
return db.SaveChanges() > 0;
} public bool UpdateEntity(T model)
{
db.CreateObjectSet<T>().Attach(model);
db.ObjectStateManager.ChangeObjectState(model, EntityState.Modified);
return db.SaveChanges() > 0;
}
}
然后我们的 ProductRepository 就变成 先继承自 基仓储,然后实现了 IProductRepository
public class ProductRepository :BaseRepository<Product>,IProductRepository
{ }
同样 UserInfoRepository 也是如此
public class UserInfoRepository:BaseRepository<UserInfo>,IUserInfoRepository
{ }
如果用图来表示的话,如下
MVC+Ef项目(2) 如何更改项目的生成顺序;数据库访问层Repository仓储层的实现的更多相关文章
- MyEclipse2016项目内复制一个项目,如何更改项目的访问路径
在MyEclipse2010版本如果复制了一个项目,需要改项目的访问路径的话,可以选中项目右键,点开Properties,在顶部搜索web,就会出现如下内容,这是只需要在里面更改路径就可以了. 而在2 ...
- MVC+Ef项目(1) 项目的框架搭建
一:首先我们来搭建最基本的项目框架,这里使用MVC3作为web项目,然后我们添加几个类库项目 最后的项目如下, 其中有一个 YouJiao.MvcWeb.Repository 实际就当做是 DAL层即 ...
- Asp.net MVC + EF + Spring.Net 项目实践3
Asp.net MVC + EF + Spring.Net 项目实践 这一篇要整合Model层和Repository层,提供一个统一的操作entity的接口层,代码下载地址(博客园上传不了10M以上的 ...
- Asp.net MVC + EF + Spring.Net 项目实践(目录)
用4篇博客来搭一个MVC的框架,可能对初学者会有一些帮助,大家共勉吧.我觉得对于中小型项目,这个框架可能还是有一定的用处的,希望能够帮助到一些人. Asp.net MVC + EF + Spring. ...
- ASP.NET Core MVC+EF Core项目实战
项目背景 本项目参考于<Pro Entity Framework Core 2 for ASP.NET Core MVC>一书,项目内容为party邀请答复. 新建项目 本项目开发工具为V ...
- Layui+MVC+EF (项目从新创建开始)
最近学习Layui ,就准备通过Layui来实现之前练习的项目, 先创建一个新的Web 空项目,选MVC 新建项目 创建各种类库,模块之间添加引用,并安装必要Nuget包(EF包) 模块名称 模块 ...
- MVC+Ef项目(4) 抽象业务逻辑层BLL层
接下来,我们就要到业务逻辑层了,简单的说,业务逻辑层就是调用Repository(可以看做是DAL数据库访问层) 先来看看项目的架构 我们现在就开始来做BLL层. 同样,先编写 UserInfoS ...
- Asp.net MVC + EF + Spring.Net 项目实践(三)
这一篇要整合Model层和Repository层,提供一个统一的操作entity的接口层,代码下载地址(博客园上传不了10M以上的文件,所以用了百度):http://pan.baidu.com/s/1 ...
- MVC+Ef项目(3) 抽象数据库访问层的统一入口;EF上下文线程内唯一
抽象一个数据库访问层的统一入口(类似于EF的上下文,拿到上下文,就可以拿到所有的表).实际这个入口就是一个类,类里面有所有的仓储对应的属性.这样,只要拿到这个类的实例,就可以点出所有的仓储,我们在 R ...
随机推荐
- Extjs中自定义事件
//Ext中所谓的响应事件,响应的主要是组件中已经定义的事件(通过看api各组件的events可以找到) //主要作用就是利用on调用各组件的事件处理函数,然后在函数中作用户想要的操作 ...
- c#实现Socket网络编程
命名空间: 在网络环境下,我们最感兴趣的两个命名空间是System.Net和 System.Net.Sockets. System.Net命名空间通常与较高程的操作有关,例如download或uplo ...
- js调试-定位到函数所在文件位置
原文:http://www.cnblogs.com/52cik/p/js-console-show-source.html 在控制台输入要查找的函数名如votePost 然后回车: 函数源码粗显啦,并 ...
- HDU2295 Radar (DLX)
下面的代码99%参考了这个网站http://www.cnblogs.com/183zyz/archive/2011/08/07/2130193.html 人生的第一道DLX肯定是需要作一些参考的啦. ...
- POJ 2000
#include<iostream> #include<cstdio> #define MAXN 10009 using namespace std; ]; int main( ...
- DevExpress licenses.licx 问题
在DevExpress ( 当然并不范指DevExpress,很多收费软件都是这样的)中,licenses.licx 是用户许可证书文件,当我们使用某些ActiveX(是Microsoft对于一系列策 ...
- hdu 4759 Poker Shuffle 二进制
思路:主要是二进制的运用. 为了方便从0开始,首先看下右移一下,高位异或1的规律:(可以从右往左一列一列看) 000(0) -> 100(4) -> 110(6) -> 111(7) ...
- 常用搜索引擎的算分,你get了嘛?
搜索引擎发展至今,已公布了多种算法.作为SEOER的你,还不懂,就out啦.懂了不会用,也是然并卵的一种行为.了解算法知识并不懂得如何把算法实践于SEO工作的你,还是处于学生思维,是时候该升级了.且听 ...
- 23种设计模式学习一(单列模式)singleton
单列模式的类(单线程下的) class Singleton { private static Singleton instance; private Singleton() { } public st ...
- I,P,B帧和PTS,DTS的关系
http://www.cnblogs.com/qingquan/archive/2011/07/27/2118967.html 基本概念: I frame :帧内编码帧 又称intra picture ...