Entity Framework 泛型使用
因为增删改查是我们常用到的方法,我们不可能每个数据模型都去完成增删改查,这样的办法太笨拙了。我们可以写个父类(包含增删改查),然后让所有的数据模型类继承该父类。那就要求我们的父类必须使用泛型来实现。
using System;
using System.Collections.Generic;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication1
{
/// <summary>
/// 定义泛型,必须规定T为类,不然db.Set<T>会报错
/// </summary>
/// <typeparam name="T"></typeparam>
class DALBase<T> where T:class
{
//因为我们要操作数据库,所以先实例化一个上下文
Model1Container db = new Model1Container(); #region 添加方法
/// <summary>
/// 添加方法
/// </summary>
/// <param name="Model"></param>
public void add(T Model)
{
db.Set<T>().Add(Model);
db.SaveChanges();
}
#endregion #region 修改单个实体
/// <summary>
/// 修改单个实体
/// </summary>
/// <param name="Model"></param>
/// <param name="strs"></param>
public void update(T Model, params string[] strs)
{
DbEntityEntry entry = db.Entry<T>(Model);
entry.State = System.Data.EntityState.Unchanged;
foreach (string tempStr in strs)
{
entry.Property(tempStr).IsModified = true;
}
db.SaveChanges();
}
#endregion #region 批量修改,根据反射,稍微要复杂一些
/// <summary>
/// 批量修改,根据反射,稍微要复杂一些
/// </summary>
/// <param name="Model">将值存入属性中</param>
/// <param name="where">批量修改的条件</param>
/// <param name="strs">属性</param>
public void updateBatch(T Model, Expression<Func<T, bool>> where, params string[] strs)
{
//先根据条件查出符合要修改的集合
List<T> tempList = db.Set<T>().Where(where).ToList();
//获取类型
Type t = typeof(T);
//利用反射获取T类型public属性集合
List<PropertyInfo> tempPro = t.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance).ToList();
Dictionary<string, PropertyInfo> propertyDic = new Dictionary<string, PropertyInfo>();
//遍历T的所有属性,将符合修改的存入字典中
tempPro.ForEach(p => { if (strs.Contains(p.Name)) { propertyDic.Add(p.Name, p); } });
//遍历要修改的属性
foreach (string str in strs)
{
if (propertyDic.ContainsKey(str))
{
PropertyInfo propertyInfo = propertyDic[str];
//获取要修改属性的值
object value = propertyInfo.GetValue(Model, null);
foreach (T tempData in tempList)
{
//设置值
propertyInfo.SetValue(tempData, value, null);
}
}
}
}
#endregion #region 根据实体id删除操作
/// <summary>
/// 根据实体id删除操作
/// </summary>
/// <param name="Model"></param>
public void remove(T Model)
{
db.Set<T>().Attach(Model);
db.Set<T>().Remove(Model);
db.SaveChanges();
}
#endregion #region 根据条件删除操作
/// <summary>
/// 根据条件删除操作
/// </summary>
/// <param name="remWhere"></param>
public void removeByWhere(Expression<Func<T, bool>> remWhere)
{
List<T> tempList = db.Set<T>().Where(remWhere).ToList();
tempList.ForEach(t => { db.Set<T>().Attach(t); db.Set<T>().Remove(t); });
db.SaveChanges();
}
#endregion #region 一般带条件查询
/// <summary>
/// 一般带条件查询
/// </summary>
/// <param name="where"></param>
/// <returns></returns>
public List<T> getList(System.Linq.Expressions.Expression<Func<T, bool>> where)
{
return db.Set<T>().Where(where).ToList();
}
#endregion #region 带条件排序,页码页容量查询
/// <summary>
/// 带条件排序,页码页容量查询
/// </summary>
/// <typeparam name="TKey"></typeparam>
/// <param name="where"></param>
/// <param name="orderBy"></param>
/// <param name="pageSize"></param>
/// <param name="pageIndex"></param>
/// <returns></returns>
public List<T> getListOrder<TKey>(Expression<Func<T, bool>> where, Expression<Func<T, TKey>> orderBy, int pageSize, int pageIndex)
{
return db.Set<T>().Where(where).OrderBy(orderBy).Skip(pageIndex - ).Take(pageSize).ToList();
}
#endregion
}
}
里面用到了反射,可能有些复杂,EF要告一段落了,下面开始记录mvc学习历程了。以后可能还会写个小项目,使用mvc+EF
Entity Framework 泛型使用的更多相关文章
- Entity Framework泛型封装
Entity Framework本身的增删改查其实 已经很方便了,不过做项目的时候用的多了也就觉得有点累了,每个业务实体基本上都涉及到到了增删改查这四个基本的要素,至于封装每个公司可能都不一样,接口, ...
- .net entity framework 泛型 更新与增加记录
static public bool SaveOrUpdate<T>(T entity) where T: class { bool result = false; using (wech ...
- Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)
很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...
- .NET基础篇——利用泛型与反射更新实体(ADO.NET Entity Framework)(转)
自从ADO.NET Entity Framework面世以来,受到大家的热捧,它封装了大量代码生成的工具,用户只需要建立好实体之间的关系,系统就是会为用户自动成功了Add.Delete.CreateO ...
- Entity Framework 与 面向对象
说要分享,我了个*,写了一半放草稿箱了两个星期都快发霉了,趁着周末写完发出来吧. 文章分为五部分: 基础.类讲述的是用到的一些EF与面向对象的基础: 业务是讲怎么划分设计业务: 设计模式和工作模式讲述 ...
- Entity Framework 教程——创建实体数据模型
创建实体数据模型: 本文将带你创建实体数据模型(EDM)SchoolDB数据库和理解基础建设模块. 实体数据模型(EDM)是用于描述实体之间关系的一种模型,以下将使用Visual Studio 201 ...
- 8天掌握EF的Code First开发之Entity Framework介绍
返回<8天掌握EF的Code First开发>总目录 本篇目录 Entity Framework概要 什么是ORM Entity Framework简史 Entity Framework具 ...
- [ASP.NET MVC 小牛之路]06 - 使用 Entity Framework
在家闲着也是闲着,继续写我的[ASP.NET MVC 小牛之路]系列吧.在该系列的上一篇博文中,在显示书本信息列表的时候,我们是在程序代码中手工造的数据.本文将演示如何在ASP.NET MVC中使用E ...
- 3、ASP.NET MVC入门到精通——Entity Framework增删改查
这里我接上讲Entity Framework入门.从网上下载Northwind数据库,新建一个控制台程序,然后重新添加一个ado.net实体数据模型. EF中操作数据库的"网关"( ...
随机推荐
- Puppet安装与配置简介(附视频教程)
Puppet是一种Linux平台的集中配置管理系统,他可管理配置文件.用户.cron任务.软件包.系统服务等.puppet把这些系统实体称之为资源,puppet采用C/S星状的结构,所有的客户端和一个 ...
- [drp 7]转发和重定向的区别
导读:类似于response.sendRedirect(request.getContextPath()+"/servlet/item/SearchItemServlet");和r ...
- WP8_访问ListBox中的Item项中的某个元素
How to access a Control placed inside ListBox ItemTemplate in WP7(转) In this post I am going to talk ...
- jQuery--each遍历使用方法
定义和用法 each() 方法规定为每个匹配元素规定运行的函数. 提示:返回 false 可用于及早停止循环. 语法 $(selector).each(function(index,element)) ...
- WP8 调用特定API权限不足
1.在解决方案中依次打开 Properties -> WMAppManifest.xml 2.点击功能 3.在左侧功能列表中勾选想要的功能权限.完毕
- C++ streambuf用法
class LogStreamBuf : public std::streambuf { public: // REQUIREMENTS: "len" must be >= ...
- Run JavaScript on your PeopleSoft pages conditionally
Here, PeopleCode sets the logic that determines when the JavaScript code will run. This is not as si ...
- JQuery Validate使用总结
本文参考了 http://www.cnblogs.com/linjiqin/p/3431835.html 可以在mvc 或webform项目中使用,可以方便快捷的对前端表单进行校验 一.导入两个js ...
- jMeter 监控cpu、内存
http://jmeter-plugins.org/downloads/all/ 将JMeterPlugins.jar包复制到Jmeter的lib目录下面的ext目录下面,重新启动Jmeter,我们点 ...
- mac虚拟机parallels 无法启动 "Windows 7" 虚拟机
关机前在虚拟机上安装了个游戏有点大,第二天开机就使用不了虚拟机了: 提示:mac虚拟机parallels 无法启动 "Windows 7" 虚拟机. 释放至少 241 MB 的 ...