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

 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. http://www.cnblogs.com/vowei/archive/2012/08/24/2654287.html

    原创开源项目 - 扩展iQuery - 知平软件 - 博客园 return node.getProperty("mBottom").getValue();

  2. c# 字符串(含有汉字)转化为16进制编码(转)

    public static string Str2Hex(string s) { string result = string.Empty; byte[] arrByte = System.Text. ...

  3. 按照 where id in ()排序

    select * from ibs6_terminal_adv_inf where id in (16,14,15) order by find_in_set(id,'16,14,15')

  4. EasyUI-Combox

    Combox的数据格式和默认选中项设置 [{ "id":1, "text":"text1" },{ "id":2, &q ...

  5. javaSE第五天

    第五天    22 1. 方法(掌握)    22 (1)方法:就是完成特定功能的代码块.    22 (2)格式:    22 (3)两个明确:    23 (4)方法调用    23 (5)案例: ...

  6. u-boot、kernel和filesystem 执行过程分析

    标题: Uboot -kerne-root 启动流程 内容: ※uboot启动流程 ※Kernel启动流程 ※Root启动流程 ※构建根文件系统 /************************** ...

  7. 《深入剖析Tomcat》读书笔记(一)

    一.Tomcat Tomcat,全名Apache Tomcat,最初是由Sun发起,后来捐赠给ASF,是Apache Jakarta下的一个子项目.Tomcat是对Servlet API定义的容器的一 ...

  8. 举例详解CSS中的继承

    CSS的继承是由所使用的样式属性定义的.换句话说,当你查看CSS属性backgruound-color,你会看到一栏「继承性」,也许你几乎没有在意过它,但是它还是十分有用的.什么是CSS继承 每一个元 ...

  9. ERROR 2003: Can't connect to MySQL server on 'localhost' (10061)

    解决Can't connect to MySQL server on 'localhost'  tomcat连接mysql,大概是c3p0配置和mysql配置都有问题,导致了内存溢出,几天后,mysq ...

  10. IOS学习感想

    1.一开始学习的时候将会感到非常的难,即使自己曾经学过C/JAVA/HTML/CSS/JS/PHP等,但是对于学过C++的人来说,我就不知道了.因为它的语法不同于任何一门语言,所以说入门难是正常的.但 ...