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中操作数据库的"网关"( ...
随机推荐
- python函数基础以及函数参数简解
python中函数分为函数.内置函数Python所有的内置函数 自定义函数要使用def语句,依次写出函数名.括号.括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回. ...
- ZoneMinder配置与使用
ZoneMinder是一套基于Linux操作系统的摄像机的视像数据监控的应用软件.应用范围广泛,包括商业或家居防盗等.ZoneMinder支持单一或多台视像镜头应用,包括摄取.分析.记录.和监视来源, ...
- Loadrunner:集合点(Rendezvous)
集合点:等到特定的用户数后再一起执行某个操作,比如一起登录.一起发信,一般情况下使用不到集合点,不过,订票系统或者促销类需要用到,比如说某个促销品的促销时间在8点到8点30,这样的话,就可能出现在8点 ...
- console.log在线调试
前端开发人员工作有时候会用到console.log,PC端直接能打开开发者工具.但是移动端就不太方便了,为此提供一种简单的方法,只需2步: 1.打开http://jsconsole.com/ 输入: ...
- 高效率的全组合算法(Java版实现)
博客上看到的一个算法,用Java实现了一个 算法描述: 算法说明:当n大于2时,n个数的全组合一共有(2^n)-1种. 当对n个元素进行全组合的时候,可以用一个n位的二进制数表示取法. 1表示在该位取 ...
- 当局部变量遇上全局变量——extern及花括号用法举例
请阅读以下代码并说出它的输出结果. #include <stdio.h> ; int foo() { ; { extern int val; printf("val_foo = ...
- 网络流量监控工具iftop
#-------------------网络流量监控工具iftop---------------##! /bin/sh #1.首先安装依赖关系包yum install flex byacc libpc ...
- CentOS 5.x版本升级Mysql
#-----------------------------CentOS 5.x版本升级Mysql ------------------#! /bin/sh #1.关闭selinuxcp -rp /e ...
- css中li、a、span行内强制不换行
li.a.span行内强制不换行:white-space:nowrap; 没有之前的效果 加上white-space:nowrap;后
- php spl
最近在重构后台,自写rbac,发现自己在设计模式方面尤为欠缺,没有一个长远的目光,所以打算静下心来看一看自己平时不关注的功能,spl就是其中之一. spl是Standard PHP Library(P ...