因为增删改查是我们常用到的方法,我们不可能每个数据模型都去完成增删改查,这样的办法太笨拙了。我们可以写个父类(包含增删改查),然后让所有的数据模型类继承该父类。那就要求我们的父类必须使用泛型来实现。

 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 泛型使用的更多相关文章

  1. Entity Framework泛型封装

    Entity Framework本身的增删改查其实 已经很方便了,不过做项目的时候用的多了也就觉得有点累了,每个业务实体基本上都涉及到到了增删改查这四个基本的要素,至于封装每个公司可能都不一样,接口, ...

  2. .net entity framework 泛型 更新与增加记录

    static public bool SaveOrUpdate<T>(T entity) where T: class { bool result = false; using (wech ...

  3. Entity Framework 实体框架的形成之旅--基于泛型的仓储模式的实体框架(1)

    很久没有写博客了,一些读者也经常问问一些问题,不过最近我确实也很忙,除了处理日常工作外,平常主要的时间也花在了继续研究微软的实体框架(EntityFramework)方面了.这个实体框架加入了很多特性 ...

  4. .NET基础篇——利用泛型与反射更新实体(ADO.NET Entity Framework)(转)

    自从ADO.NET Entity Framework面世以来,受到大家的热捧,它封装了大量代码生成的工具,用户只需要建立好实体之间的关系,系统就是会为用户自动成功了Add.Delete.CreateO ...

  5. Entity Framework 与 面向对象

    说要分享,我了个*,写了一半放草稿箱了两个星期都快发霉了,趁着周末写完发出来吧. 文章分为五部分: 基础.类讲述的是用到的一些EF与面向对象的基础: 业务是讲怎么划分设计业务: 设计模式和工作模式讲述 ...

  6. Entity Framework 教程——创建实体数据模型

    创建实体数据模型: 本文将带你创建实体数据模型(EDM)SchoolDB数据库和理解基础建设模块. 实体数据模型(EDM)是用于描述实体之间关系的一种模型,以下将使用Visual Studio 201 ...

  7. 8天掌握EF的Code First开发之Entity Framework介绍

    返回<8天掌握EF的Code First开发>总目录 本篇目录 Entity Framework概要 什么是ORM Entity Framework简史 Entity Framework具 ...

  8. [ASP.NET MVC 小牛之路]06 - 使用 Entity Framework

    在家闲着也是闲着,继续写我的[ASP.NET MVC 小牛之路]系列吧.在该系列的上一篇博文中,在显示书本信息列表的时候,我们是在程序代码中手工造的数据.本文将演示如何在ASP.NET MVC中使用E ...

  9. 3、ASP.NET MVC入门到精通——Entity Framework增删改查

    这里我接上讲Entity Framework入门.从网上下载Northwind数据库,新建一个控制台程序,然后重新添加一个ado.net实体数据模型. EF中操作数据库的"网关"( ...

随机推荐

  1. Puppet安装与配置简介(附视频教程)

    Puppet是一种Linux平台的集中配置管理系统,他可管理配置文件.用户.cron任务.软件包.系统服务等.puppet把这些系统实体称之为资源,puppet采用C/S星状的结构,所有的客户端和一个 ...

  2. [drp 7]转发和重定向的区别

    导读:类似于response.sendRedirect(request.getContextPath()+"/servlet/item/SearchItemServlet");和r ...

  3. WP8_访问ListBox中的Item项中的某个元素

    How to access a Control placed inside ListBox ItemTemplate in WP7(转) In this post I am going to talk ...

  4. jQuery--each遍历使用方法

    定义和用法 each() 方法规定为每个匹配元素规定运行的函数. 提示:返回 false 可用于及早停止循环. 语法 $(selector).each(function(index,element)) ...

  5. WP8 调用特定API权限不足

    1.在解决方案中依次打开  Properties -> WMAppManifest.xml 2.点击功能 3.在左侧功能列表中勾选想要的功能权限.完毕

  6. C++ streambuf用法

    class LogStreamBuf : public std::streambuf { public: // REQUIREMENTS: "len" must be >= ...

  7. 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 ...

  8. JQuery Validate使用总结

    本文参考了  http://www.cnblogs.com/linjiqin/p/3431835.html 可以在mvc 或webform项目中使用,可以方便快捷的对前端表单进行校验 一.导入两个js ...

  9. jMeter 监控cpu、内存

    http://jmeter-plugins.org/downloads/all/ 将JMeterPlugins.jar包复制到Jmeter的lib目录下面的ext目录下面,重新启动Jmeter,我们点 ...

  10. mac虚拟机parallels 无法启动 "Windows 7" 虚拟机

    关机前在虚拟机上安装了个游戏有点大,第二天开机就使用不了虚拟机了: 提示:mac虚拟机parallels  无法启动 "Windows 7" 虚拟机.  释放至少 241 MB 的 ...