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

 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. asp.net ashx 一般处理程序 使用async await异步直接 copy可用哦

    以前一直很懒  碰到ashx要用await异步就绕开  用aspx  或者mvc异步控制器  这次公司需要  我查了国内的文章基本都不能简单copy来处理一堆错关键的过程中函数BeginProcess ...

  2. WPF和WINFORM的互操作

    在WPF中使用Winform控件 <Window x:Class="WPFApplication.Window1" xmlns="http://schemas.mi ...

  3. VirtualBox是什么

    VirtualBox 是一款 x86 虚拟机软件.原由德国innotek公司开发,2008年Sun收购了Innotek,而Sun于2010年被Oracle收购,2010年1月21日改 名成 Oracl ...

  4. js中settimeout方法加参数

    js中settimeout方法加参数的使用. 简单使用看w3school  里面没有参数调用,  例子: <script type="text/javascript"> ...

  5. 一个php函数,能够遍历一个文件夹下的所有文件和子文件夹

    <?phpfunction my_scandir($dir){    $files=array();    if(is_dir($dir))     {        if($handle=op ...

  6. C++12!配对

    题目内容:找出输入数据中所有两两相乘的积为12!的对数. 输入描述:输入数据中含有一些整数n(1<=n<232). 输出描述:输出所有两两相乘的积为12!的对数. 题目分析:对于输入的每个 ...

  7. Fragment的创建以及与activity的参数传递

    点击下面不同的TextView变化不同的Fragment avtivity与Fragment之间传递消息不能使用构造器传递,用bunder传递 首先写一个含有FrameLayout(这个布局最佳),里 ...

  8. 常用icon以及color颜色RGB值和对应颜色效果图

    Android谷歌官方扁平化设计常用icon集合   Android谷歌官方扁平化设计color颜色RGB值和对应颜色效果图.

  9. 禁止 PC端打开网页 进行跳转

    try {var urlhash = window.location.hash;if (!urlhash.match("fromapp")){if ((navigator.user ...

  10. Java 为什么使用抽象类和接口

    Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现.OOP面向对象的编程,如果要提高程序的复用率,增加程序的可维护性,可扩展性,就必须是面向接口的编程,面向抽象的编程, ...