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):框 ...
随机推荐
- FinanceJson
FinanceJson, 对Json的包装.底层使用jackson实现. 1. 生成节点 (1)在某个路径下添加某个节点 FinanceJson financeJsonInfo = FinanceJs ...
- QQ JS省市区三级联动
如下图: 首先写一个静态的页面: <!DOCTYPE html> <html> <head> <title>QQ JS省市区三级联动</title ...
- 如何定制你自己的jQuery
jQuery随着版本的不断升级代码量也随之增加,从1.0.0的不到两千行到现在的1.10.2已经突破1万行. 新的API不断增加,但有些在项目中并没有用到.jQuery团队很早就考虑到这一点,按模块来 ...
- openPOWERLINK开源POWERLINK协议栈说明文档中文非官方翻译
GitBook分享,翻译进行中:https://winshton.gitbooks.io/openpowerlink-stack-cn/content/
- 【Android 基础】Android中全屏或者取消标题栏
先介绍去掉标题栏的方法: 第一种:也一般入门的时候经常使用的一种方法 requestWindowFeature(Window.FEATURE_NO_TITLE);//去掉标题栏 注意这句一定要写在se ...
- java 空指针异常(java.lang.NullPointerException)
在Java中对值为null的指针调用任何方法,就会引发空指针异常(java.lang.NullPointerException).空指针异常绝对 是Java中最难查找和调试的一种异常,你永远无法得到任 ...
- 2014 Super Training #6 G Trim the Nails --状态压缩+BFS
原题: ZOJ 3675 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3675 由m<=20可知,可用一个二进制数表 ...
- Jenkins遇到问题二:Jenkins服务器磁盘空间管理策略
Jenkins在帮助我们自动化构建服务的同时也在消耗服务器的磁盘空间,试想如果构建的项目个数很多,而Jenkins 服务器磁盘空间又不是非常大的话,每隔一段时间磁盘空间就会爆满导致Jenkins出现磁 ...
- java9-2形式参数
1.形式参数: 基本类型(太简单) 引用类型 类名:(匿名对象的时候其实我们已经讲过了)需要的是该类的对象 抽象类:需要的是该抽象的类子类对象 接口:需要的是该接口的实现类对象 A. 类名:(匿名对象 ...
- ajax载入数据是小细节
今天看了一个点子: 在 ajax 导入数据的 div中添加一些样式,比如:我们正紧急抢救 增加趣味性,有解决数据卡壳问题