ASP.NET MVC系列 框架搭建(一)之仓储层的搭建
大神勿喷,小神默默学。
会了就是不值一提的东西,不会就是绝对的高大上。
最后上传源码。希望能给读者带来一些新的认识及知识。
还没上过头条。。各位大神,请点支持一下小弟。
陆续更新。更新到你会为止!!
我不是话唠,我只把重点点出来,细枝末节的不懂的可以留言探讨。这个系列的最后,我会再统一的把大家的问题,列在一篇新的Blog。工作需要规划,写博客也是如此。
仓储层:待优化
基接口:约束
子接口:实现基接口。进一步约束子仓储中特殊的方法。
*基仓储:具体实现,子类继承接口的方法。
这步最难,最重要!
①db不能直接点出具体的Model,只能db.CreateObjectSet<T>().AddObject(entity);将实体“附加”到上下文。
②where和order方法需要传lamada。各自类型问题。where<T,bool> order<T,S>的使用。
③Select时候IEumarable<T>转换IQueryable<T>需要AsQueryable()方法。
子仓储:只写除了基类和接口的方法之外外特殊的需求方法。比如多表。
以UserInforRespository为例:
IBaseRespository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Entity; //添加System.Data.Entity引用
namespace LKBS.CommunicationPlatform.IDAL
{
public interface IBaseRespository<T> where T : class ,new()
{
//接口不需要上下文db
// int rowcount = 0;
//public 对接口方法无效
bool AddEntity(T entity);
bool DeleteEntity(T entity);
bool UpdateEntity(T entity);
T SelectOneEntity(Func<T, bool> wherelamda);
IQueryable<T> SelectAllEntityList(Func<T, bool> wherelamda); IQueryable<T> SelectPageEntityList<S>(Func<T, S> orderLamda, Func<T, bool> whereLamda, int pageIndex, int pageSize, bool isAsc, out int rowcount);
}
}
BaseRespository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using System.Data.Entity;
using LKBS.CommunicationPlatform.Model;
using LKBS.CommunicationPlatform.IDAL;
using System.Data; namespace LKBS.CommunicationPlatform.DAL
{
public class BaseRespository<T> where T : class,new()
{
ModelContainer db = new ModelContainer(); /// <summary>
/// 增加
/// </summary>
/// <param name="entity">增加实体,实体没赋的属性为NULL</param>
/// <returns></returns>
public bool AddEntity(T entity)
{
db.CreateObjectSet<T>().AddObject(entity);
//db.ObjectStateManager.ChangeObjectState(entity, EntityState.Added);
db.SaveChanges();
return true;
}
/// <summary>
/// 删除
/// </summary>
/// <param name="entity">方便附加到上下文一个实体,传入实体,用到只有ID</param>
/// <returns></returns>
public bool DeleteEntity(T entity)
{
//var temp= db.UserInfor.Where(userinfor=>userinfor.ID>=id).FirstOrDefault<UserInfor>();
//db.UserInfor.Attach(userinfor);
//db.ObjectStateManager.ChangeObjectState(userinfor, EntityState.Deleted);
db.CreateObjectSet<T>().AddObject(entity);
db.ObjectStateManager.ChangeObjectState(entity, EntityState.Deleted);
db.SaveChanges();
return true;
}
/// <summary>
/// 改
/// </summary>
/// <param name="entity"></param>
/// <returns></returns>
public bool UpdateEntity(T entity)
{
//db.UserInfor.Attach(userinfor);
//db.ObjectStateManager.ChangeObjectState(userinfor, EntityState.Modified);
db.CreateObjectSet<T>().AddObject(entity);
db.ObjectStateManager.ChangeObjectState(entity, EntityState.Modified);
db.SaveChanges();
return true;
}
/// <summary>
/// 单个实体
/// </summary>
/// <param name="wherelamda"></param>
/// <returns></returns>
public T SelectOneEntity(Func<T, bool> wherelamda)
{
var rowTemp = db.CreateObjectSet<T>().Where<T>(wherelamda).FirstOrDefault<T>();
return rowTemp;
}
/// <summary>
/// 查询 整张表或者多个实体
/// </summary>
/// <returns></returns>
public IQueryable<T> SelectAllEntityList(Func<T, bool> wherelamda)
{
var rowsTemp = db.CreateObjectSet<T>().Where<T>(wherelamda);
return rowsTemp.AsQueryable<T>();
}
int rowcount = ;
//泛型方法 <S>就是约束参数的类型,传什么参数,“自动识别”<S>. 定义需要<S>,调用该方法可以省略 :因为传的参数就已确定<S>的类型
public IQueryable<T> SelectPageEntityList<S>(Func<T, S> orderLamda, Func<T, bool> whereLamda, int pageIndex, int pageSize, bool isAsc, out int rowcount)
{//非页数pageCount,是总行数
//IEnumerable<>
var temp = db.CreateObjectSet<T>().Where<T>(whereLamda);
rowcount = temp.Count<T>();
if (isAsc)
{
//IQueryable
IEnumerable<T> entityPageList =
temp
.OrderBy<T, S>(orderLamda)
.Skip<T>((pageIndex - ) * pageSize).
Take<T>(pageSize);
//pageCount=db.UserInfor.
return entityPageList.AsQueryable();
}
else
{
IEnumerable<T> entityPageList =
//db.UserInfor
//.Where<UserInfor>(whereLamda)//u => u.ID > 0
temp
.OrderByDescending<T, S>(orderLamda)//u => u.ID
.Skip<T>((pageIndex - ) * pageSize).
Take<T>(pageSize);
//pageCount=db.UserInfor.
return entityPageList.AsQueryable();
} }
}
}
IUserInforRespository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using LKBS.CommunicationPlatform.Model; namespace LKBS.CommunicationPlatform.IDAL
{
public interface IUserInforRespository:IBaseRespository<UserInfor>
{
}
}
UserInforRespository.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using LKBS.CommunicationPlatform.Model;
using System.Data;
using LKBS.CommunicationPlatform.IDAL; namespace LKBS.CommunicationPlatform.DAL
{
public class UserInforRespository:BaseRespository<UserInfor>,IUserInforRespository
{
}
}
ASP.NET MVC系列 框架搭建(一)之仓储层的搭建的更多相关文章
- ASP.NET MVC系列 框架搭建(三)之服务层的搭建
邯郸学步 吾虽是一不知名的菜鸟,但,吾亦有一个从后台程序员成为一名小小架构师梦想,深知架构师不是想想就成的. 吾已工作过一阵子,吾妄想在真正毕业之后工作一年左右就能拿到那个数ten thousand的 ...
- ASP.NET MVC系列 框架搭建(二)之仓储层的优化
大神勿喷,小神默默学. 会了就是不值一提的东西,不会就是绝对的高大上. 最后上传源码.希望能给读者带来一些新的认识及知识. 还没上过头条..各位大神,请点支持一下小弟. 陆续更新.更新到你会为止!! ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(14)-主框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(1)-框架搭建 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) 前言:这篇博客开始我们便一步一步的来实现这 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(24)-权限组的设计和实现(附源码)(终结)
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(23)-设置角色遗留问题和为权限设置角色以及EasyUI Tabs的使用
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(22)-为用户设置角色
ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据库访问层的设计Demo (3):面向接口编程 (4 ):业务逻辑层的封装 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列
http://www.cnblogs.com/hanyinglong/archive/2013/03/22/2976478.html ASP.NET MVC+EF框架+EasyUI实现权限管理系列之开 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(21)-用户角色权限基本的实现说明 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框 ...
随机推荐
- Centos 下oracle 11g 安装部署及手动建库过程
Oracle 11g 手动建库,在虚拟环境中,不使用DBCA工具进行创建数据库 1.Linux环境的基本配置 2.ip 10.11.30.60 3.Oracle 11g安装过程 ---------- ...
- ubuntu下ROS安装时sudo rosdep init和rosdep update的解决方法
问题: 在ubuntu上多次安装matlab选择合适的版本来调用摄像头,终于把系统搞坏了,重装系统后,ROS无法安装,每次安装到sudo rosdep init和rosdep update报错的问题, ...
- Vrrp协议
一.简介 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简 ...
- 【转载】4412开发板、PC、ubuntu通过网线连接
今天看到使用TFTP方式,开发板直接从ubuntu下载程序,不需要一直通过烧写文件系统下载,我试了一下,虚拟机.开发板.pc三者老是互相ping不通.纠结了很久终于解决了. 写下这个小笔记,供大家参考 ...
- Load xlsx in a folder to RDBMS table with Talend
Step 1 . Use tFileList component to get the file list. And set proper property. Step 2. Use tFileInp ...
- Cassandra 分布式集群
1 实施Cassandra集群,并验证集群功能正常,抓图实验过程 2 为什么说对于布隆过滤器有"确定某个元素是否在某个集合中的代价和总的元素数目无关"?误判率和元素数目有关吗?为什 ...
- UI设计实战篇——利用Bootstrap框架制作查询页面的界面
Bootstrap框架是一个前端UI设计的框架,它提供了统一的UI界面,简化了设计界面UI的过程(缺点是定制了界面,调整的余地不是太大).尤其是现在的响应时布局(我的理解是页面根据不同的分辨率,采用不 ...
- java 8-5 抽象
1. 抽象类的概述: 动物不应该定义为具体的东西,而且动物中的吃,睡等也不应该是具体的. 我们把一个不是具体的功能称为抽象的功能,而一个类中如果有抽象的功能,该类必须是抽象类. 抽象类的特点: A:抽 ...
- java 16-1 ArrayList的练习1
需求: ArrayList去除集合中字符串的重复值(去掉相同的字符串) 分析: 第一种做法:创建一个新的空集合: A:创建1个具有相同字符串的集合 B:创建1个空的集合 C:遍历第一个集合里面的元素 ...
- transition的局限
transition的优点在于简单易用,但是它有几个很大的局限. (1)transition需要事件触发,所以没法在网页加载时自动发生. (2)transition是一次性的,不能重复发生,除非一再触 ...