MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理
目录
MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型
MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理
MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案
先来了解下各项的引用关系
FytCms.DALMSSQL=》Domain.Entity、EntityFramework
BusinessLogic.Server=》FytCms.DALMSSQL
FytCms.Web=》FytCms.Helper、Domain.Entity,BusinessLogic.Server,FytCms.Common
ok 简单吧,哇咔咔
1、在Core.Repository文件夹下,建FytCms.DALMSSQL类库
这个类库主要的意思就是操作sql server的,当然你可以建FytCms.DALMySql类库,在类库增加方法
主要使用EF操作数据
/// <summary>
/// 实现接口基类
/// <remarks>创建:2015.05.04 FUYU
/// </remarks>
/// </summary>
/// <typeparam name="T">类型</typeparam>
public class BaseRepository<T> where T : class ,new()
{
/// <summary>
/// 获得数据上下文
/// </summary>
protected FytSysDbContext FytContext = new FytSysDbContext(); #region 1、添加
/// <summary>
/// 添加
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否保存</param>
/// <returns>添加后的数据实体</returns>
public T Add(T entity, bool isSave = true)
{
FytContext.Set<T>().Add(entity);
if (isSave) FytContext.SaveChanges();
return entity;
} /// <summary>
/// 同时增加多条数据到一张表(事务处理)
/// </summary>
/// <param name="entitys"></param>
/// <returns></returns>
public bool AddEntity(List<T> entitys)
{
foreach (var entity in entitys)
{
FytContext.Entry<T>(entity).State = System.Data.Entity.EntityState.Added;
}
return FytContext.SaveChanges() > ;
}
#endregion #region 2、修改
/// <summary>
/// 更新
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否保存</param>
/// <returns>是否成功</returns>
public bool Update(T entity, bool isSave = true)
{
FytContext.Set<T>().Attach(entity);
FytContext.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified;
return !isSave || FytContext.SaveChanges() > ;
} /// <summary>
/// 同时更新多条数据(事务处理)
/// </summary>
/// <param name="entitys">数据实体</param>
/// <returns>是否成功</returns>
public bool Update(List<T> entitys)
{
entitys.ForEach(entity =>
{
FytContext.Set<T>().Attach(entity);
FytContext.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified;//将所有属性标记为修改状态
});
return FytContext.SaveChanges() > ;
} /// <summary>
/// 修改一条数据,会修改指定列的值
/// </summary>
/// <returns>是否成功</returns>
public bool Update(T entity, params string[] proNames)
{
DbEntityEntry<T> dbee = FytContext.Entry<T>(entity);
if (dbee.State == System.Data.Entity.EntityState.Detached)
{
FytContext.Set<T>().Attach(entity);
}
dbee.State = System.Data.Entity.EntityState.Unchanged;//先将所有属性状态标记为未修改
proNames.ToList().ForEach(c => dbee.Property(c).IsModified = true);//将要修改的属性状态标记为修改
return FytContext.SaveChanges() > ;
}
#endregion #region 3、删除
/// <summary>
/// 删除
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否保存</param>
/// <returns>是否成功</returns>
public bool Delete(T entity, bool isSave = true)
{
FytContext.Set<T>().Attach(entity);
FytContext.Entry<T>(entity).State = System.Data.Entity.EntityState.Deleted;
return !isSave || FytContext.SaveChanges() > ;
} /// <summary>
/// 根据条件删除
/// </summary>
/// <param name="delWhere">删除表达式</param>
/// <param name="isSave">是否保存</param>
/// <returns>是否成功</returns>
public bool DeleteBy(Expression<Func<T, bool>> delWhere, bool isSave = true)
{
//3.1查询要删除的数据
List<T> listDeleting = FytContext.Set<T>().Where(delWhere).ToList();
//3.2将要删除的数据 用删除方法添加到 EF 容器中
listDeleting.ForEach(u =>
{
FytContext.Set<T>().Attach(u);//先附加到 EF容器
FytContext.Set<T>().Remove(u);//标识为 删除 状态
});
return !isSave || FytContext.SaveChanges() > ;
} /// <summary>
/// 批量物理删除数据,也可以用作单个物理删除--此方法适用于id为int类型的表--性能会比先查询后删除快
/// </summary>
/// <param name="ids">ID集合1,2,3</param>
/// <returns>是否成功</returns>
public bool DeletePhysics(string ids)
{
var tableName = typeof(T).Name;//获取表名
var sql = string.Format("delete from {0} where id in({1})", tableName, ids);
return FytContext.Database.ExecuteSqlCommand(sql) > ;
}
#endregion #region 4、查询
/// <summary>
/// 是否存在
/// </summary>
/// <param name="anyLambda">查询表达式</param>
/// <returns>布尔值</returns>
public bool Exist(Expression<Func<T, bool>> anyLambda)
{
return FytContext.Set<T>().Any(anyLambda);
} /// <summary>
/// 查询记录数
/// </summary>
/// <param name="predicate">条件表达式</param>
/// <returns>记录数</returns>
public int Count(Expression<Func<T, bool>> predicate)
{
return FytContext.Set<T>().Count(predicate);
} /// <summary>
/// 查询数据根据ID主键(优先)
/// </summary>
/// <param name="id">主键</param>
/// <returns>实体</returns>
public T GetModel(int id)
{
return FytContext.Set<T>().Find(id);
} /// <summary>
/// 查询数据
/// </summary>
/// <param name="whereLambda">查询表达式</param>
/// <returns>实体</returns>
public T GetModel(Expression<Func<T, bool>> whereLambda)
{
var entity =FytContext.Set<T>().FirstOrDefault<T>(whereLambda);
return entity;
} /// <summary>
/// 查找数据列表
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="whereLamdba">查询表达式</param>
/// <param name="orderLambda">排序表达式</param>
/// <param name="isAsc">是否升序</param>
/// <returns></returns>
public IQueryable<T> GetList<TKey>(Expression<Func<T, bool>> whereLamdba, Expression<Func<T, TKey>> orderLambda, bool isAsc)
{
return isAsc ? FytContext.Set<T>().Where(whereLamdba).OrderBy(orderLambda) :
FytContext.Set<T>().Where(whereLamdba).OrderByDescending(orderLambda);
}
#endregion #region 5、分页 /// <summary>
/// 查找分页数据列表
/// </summary>
/// <typeparam name="TKey">排序</typeparam>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">每页记录数</param>
/// <param name="rows">总行数</param>
/// <param name="totalPage">分页总数</param>
/// <param name="whereLambda">查询表达式</param>
/// <param name="isAsc">是否升序</param>
/// <param name="orderBy">排序表达式</param>
/// <returns></returns>
public IQueryable<T> GetPageList<TKey>(int pageIndex, int pageSize, out int rows, out int totalPage,
Expression<Func<T, bool>> whereLambda, bool isAsc, Expression<Func<T, TKey>> orderBy)
{
var temp = FytContext.Set<T>().Where<T>(whereLambda);
rows = temp.Count();
totalPage = rows % pageSize == ? rows / pageSize : rows / pageSize + ;
temp = isAsc ? temp.OrderBy<T, TKey>(orderBy) : temp.OrderByDescending<T, TKey>(orderBy);
return temp.Skip<T>(pageSize * (pageIndex - )).Take<T>(pageSize); }
#endregion
}
数据操作做好,下一步就是业务调用数据操作,
2、建立业务类
在BusinessLogic.Server文件夹下增加BusinessLogic.Server类库,
在该类库引用FytMsys.DALMSSQL
新建类BaseServer 具体代码如下
/// <summary>
/// BLL层抽象类
/// <remarks>创建:2015.05.04 FUYU
/// </remarks>
/// </summary>
/// <typeparam name="T">类型</typeparam>
public class BaseServer<T> where T : class,new()
{
/// <summary>
/// 实例化数据层方法
/// </summary>
protected BaseRepository<T> Repository=new BaseRepository<T>(); #region 1、添加
/// <summary>
/// 添加
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否保存</param>
/// <returns>添加后的数据实体</returns>
public T Add(T entity, bool isSave = true)
{
return Repository.Add(entity,isSave);
} /// <summary>
/// 同时增加多条数据到一张表(事务处理)
/// </summary>
/// <param name="entitys"></param>
/// <returns></returns>
public bool AddEntity(List<T> entitys)
{
return Repository.AddEntity(entitys);
}
#endregion #region 2、修改
/// <summary>
/// 更新
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否保存</param>
/// <returns>是否成功</returns>
public bool Update(T entity, bool isSave = true)
{
return Repository.Update(entity,isSave);
} /// <summary>
/// 同时更新多条数据(事务处理)
/// </summary>
/// <param name="entitys">数据实体</param>
/// <returns>是否成功</returns>
public bool Update(List<T> entitys)
{
return Repository.Update(entitys);
} /// <summary>
/// 修改一条数据,会修改指定列的值
/// </summary>
/// <returns>是否成功</returns>
public bool Update(T entity, params string[] proNames)
{
return Repository.Update(entity,proNames);
}
#endregion #region 3、删除
/// <summary>
/// 删除
/// </summary>
/// <param name="entity">数据实体</param>
/// <param name="isSave">是否保存</param>
/// <returns>是否成功</returns>
public bool Delete(T entity, bool isSave = true)
{
return Repository.Delete(entity,isSave);
} /// <summary>
/// 根据条件删除
/// </summary>
/// <param name="delWhere">删除表达式</param>
/// <param name="isSave">是否保存</param>
/// <returns>是否成功</returns>
public bool DeleteBy(Expression<Func<T, bool>> delWhere, bool isSave = true)
{
return Repository.DeleteBy(delWhere,isSave);
} /// <summary>
/// 批量物理删除数据,也可以用作单个物理删除--此方法适用于id为int类型的表--性能会比先查询后删除快
/// </summary>
/// <param name="ids">ID集合1,2,3</param>
/// <returns>是否成功</returns>
public bool DeletePhysics(string ids)
{
return Repository.DeletePhysics(ids);
}
#endregion #region 4、查询
/// <summary>
/// 是否存在
/// </summary>
/// <param name="anyLambda">查询表达式</param>
/// <returns>布尔值</returns>
public bool Exist(Expression<Func<T, bool>> anyLambda)
{
return Repository.Exist(anyLambda);
} /// <summary>
/// 查询记录数
/// </summary>
/// <param name="predicate">条件表达式</param>
/// <returns>记录数</returns>
public int Count(Expression<Func<T, bool>> predicate)
{
return Repository.Count(predicate);
} /// <summary>
/// 查询数据根据ID主键(优先)
/// </summary>
/// <param name="id">主键</param>
/// <returns>实体</returns>
public T GetModel(int id)
{
return Repository.GetModel(id);
} /// <summary>
/// 查询数据
/// </summary>
/// <param name="whereLambda">查询表达式</param>
/// <returns>实体</returns>
public T GetModel(Expression<Func<T, bool>> whereLambda)
{
return Repository.GetModel(whereLambda);
} /// <summary>
/// 查找数据列表
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="whereLamdba">查询表达式</param>
/// <param name="orderLambda">排序表达式</param>
/// <param name="isAsc">是否升序</param>
/// <returns></returns>
public IQueryable<T> GetList<TKey>(Expression<Func<T, bool>> whereLamdba, Expression<Func<T, TKey>> orderLambda, bool isAsc)
{
return Repository.GetList(whereLamdba,orderLambda,isAsc);
}
#endregion #region 5、分页 /// <summary>
/// 查找分页数据列表
/// </summary>
/// <typeparam name="TKey">排序</typeparam>
/// <param name="pageIndex">当前页</param>
/// <param name="pageSize">每页记录数</param>
/// <param name="rows">总行数</param>
/// <param name="totalPage">分页总数</param>
/// <param name="whereLambda">查询表达式</param>
/// <param name="isAsc">是否升序</param>
/// <param name="orderBy">排序表达式</param>
/// <returns></returns>
public IQueryable<T> GetPageList<TKey>(int pageIndex, int pageSize, out int rows, out int totalPage,
Expression<Func<T, bool>> whereLambda, bool isAsc, Expression<Func<T, TKey>> orderBy)
{
return Repository.GetPageList(pageIndex,pageSize,out rows,out totalPage,whereLambda,isAsc,orderBy); }
#endregion }
可以在次扩展业务方法,也可以新建一个自定义类库引用BusinessLogic.Server 在自定义类库新建自定义类扩展方法
要一步要做的就是WebUi层、
MVC5+EF6 简易版CMS(非接口) 第三章:数据存储和业务处理的更多相关文章
- MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- MVC5+EF6 简易版CMS(非接口) 第一章:新建项目
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- 简易版CMS后台管理系统开发流程
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- Android学习之路——简易版微信为例(三)
最近好久没有更新博文,一则是因为公司最近比较忙,另外自己在Android学习过程和简易版微信的开发过程中碰到了一些绊脚石,所以最近一直在学习充电中.下面来列举一下自己所走过的弯路: (1)本来打算前端 ...
- 计算机图形学 opengl版本 第三版------胡事民 第三章更多的绘图工具
opengl 计算机图形学 第三版 第二部分 第三章更多的绘图工具 3.1 概述 第2章中 我们绘图使用的是屏幕窗口的基础坐标系 以像素为单位 屏幕坐标从左下角x从0延伸到scr ...
- 从零开始,搭建博客系统MVC5+EF6搭建框架(2),测试添加数据、集成Autofac依赖注入
一.测试仓储层.业务层是否能实现对数据库表的操作 1.创建IsysUserInfoRepository接口来继承IBaseRepository父接口 namespace Wchl.WMBlog.IRe ...
- ASP.NET MVC5 网站开发实践(一) - 框架(续) 模型、数据存储、业务逻辑
上次搭建好了项目框架,但还是觉得不太对劲,后来才想起来没有对开发目标进行定位,这个小demo虽然不用做需求分析,但是要实现什么效果还得明确.后来想了一下就做个最简单的网站,目标定为小公司进行展示用的网 ...
- Blazor client-side + webapi (.net core 3.1) 添加jwt验证流程(非host)第三章 客户端存储及验证
准备工作: 安装Nuget包:Blazored.LocalStorge. 这是一个client-side 浏览器存储库,找了非常久. 官方文档中也有一款Microsoft.AspNetCore.Pro ...
随机推荐
- ssh远程连接错误
在平时工作中,有时候需要SSH登陆到别的Linux主机上去,但有时候SSH登陆会被禁止,并弹出如下类似提示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
- 10、java中的抽象类
当多个类中出现相同功能,但是功能主体不同,这是可以进行向上抽取.这时,只抽取功能定义,而不抽取功能主体. 抽象:看不懂. 抽象类的特点:1,抽象方法一定在抽象类中.2,抽象方法和抽象类都必须被abst ...
- 【学】CSS3基础实例1 - 用CSS3做网页中的小三角,以及transition的用法
自开了博客园已经有2周了吧,虽然转载了一些觉得比较有用的文章之外还没有开始写自己的一些学习记录,那就从今天开始. 目前看了妙味的不少视频,有css+html,js的基础和中级也都看完了,作业也都做了, ...
- typedef struct 结构体
typedef struct _TTTT_ { int i; }TT_TT; 定义变量如下: struct _TTTT_ NewTT;方法1 TT_TT NewTT;方法2 是声明和定义 ...
- 【javascript基础】7、继承
前言 由于本人水平有限,所以有些高手觉得现在写的内容偏容易,要一点点来嘛,今天和大家学习或者复习一下javascript的继承.我也就是尽量写吧······ 继承 javascript的继承其实主要就 ...
- BroadcastReceiver和EventBus区别是什么
BroadcastReceiver和EventBus区别是什么?他俩都挺像的,什么时候用BroadcastReceiver,什么时候用EventBus呢? Android广播分为两个方面:广播发送者和 ...
- Python基础篇【第2篇】: Python文件操作
Python文件操作 在Python中一个文件,就是一个操作对象,通过不同属性即可对文件进行各种操作.Python中提供了许多的内置函数和方法能够对文件进行基本操作. Python对文件的操作概括来说 ...
- 欧几里得&扩展欧几里得
原博网址:http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html 欧几里德算法 欧几里德算法又称辗转相除法,用于计算两个整数 ...
- DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?
DELPHI声明一个指针变量,什么时候需要分配内存,什么时候不需要分配内存?比如我定义个变量 var p:Pchar;如果这个变量声明为全局变量,需要分配内存吗?分配为局部变量,需要分为内存吗?为什么 ...
- CentOS6.5下安装apache2.2和PHP 5.5.28
CentOS6.5下安装apache2.2 1. 准备程序 :httpd-2.2.27.tar.gz 下载地址:http://httpd.apache.org/download.cgi#apache2 ...