目录

一.EF修改和删除的多种方法

二.标准查询where

三.include

四.skip take

五.反射获取实例属性

六.EF DLL数据访问帮助类

一.EF修改和删除的多种方法

方法1:官方推荐 先查询在修改 或者删除

 var student = db.Students.FirstOrDefault(t => t.Id == Mid);
student.Name = "修改后";//修改值数据
db.SaveChanges();//保存
4 db.Students.Remove(student);//移除对象
db.SaveChanges();//保存

方法2:先附加到ef实体对象 然后在移除

 Students s = new Students();
s.Id = int.Parse(id);
db.Students.Attach(s);//将实体附加到 上下文中 ;
db.Students.Remove(s);
if (db.SaveChanges() >= )
{
//成功
}

方法3:添加到ef实体对象 然后标记删除

 Students s = new Students();
s.Id = int.Parse(id);
db.Entry<Students>(s).State = System.Data.EntityState.Deleted;//标记删除
int num = db.SaveChanges();

方法4:修改实体

 //这里需要关闭验证 不然会报错
db.Configuration.ValidateOnSaveEnabled = false;
DbEntityEntry dbS = db.Entry<Students>(s);
dbS.State = System.Data.EntityState.Unchanged; //清楚所有字段标记
dbS.Property("Gender").IsModified = true;//标记修改字段
int num = db.SaveChanges();
db.Configuration.ValidateOnSaveEnabled = true;//打开验证
if (num >= )
{
//修改成功
}

二.标准查询where 在不同场景 实现方法不一样

 //场景1:ef的数据集 使用where 是在 IQueryable 的扩展方法
//场景2:List集合的数据集 使用where 是在 IEnumerable 的扩展方法

三.include

场景1:自动 连接查询【无Include】

 //1.自动 连接查询【无Include】
var stu1 = db.Students.Where(t => t.Classes.CName == "zha");
var cname = stu1.FirstOrDefault();
 SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[CId] AS [CId],
[Extent1].[Name] AS [Name],
[Extent1].[Gender] AS [Gender],
[Extent1].[IsDel] AS [IsDel],
[Extent1].[AddTime] AS [AddTime]
FROM [dbo].[Students] AS [Extent1]
INNER JOIN [dbo].[Classes] AS [Extent2] ON [Extent1].[CId] = [Extent2].[CID]
WHERE 'zha' = [Extent2].[CName]

场景2:手动 内连接查询【有Include】

 //2手动 内连接查询【有Include】
var stu2 = db.Students.Include("Classes").Where(t => t.Id == );
var ccc = stu2.FirstOrDefault().Classes.CName;
 SELECT
[Limit1].[Id] AS [Id],
[Limit1].[CId] AS [CId],
[Limit1].[Name] AS [Name],
[Limit1].[Gender] AS [Gender],
[Limit1].[IsDel] AS [IsDel],
[Limit1].[AddTime] AS [AddTime],
[Extent2].[CID] AS [CId1],
[Extent2].[CName] AS [CName],
[Extent2].[CCount] AS [CCount],
[Extent2].[CImg] AS [CImg],
[Extent2].[CIsDel] AS [CIsDel],
[Extent2].[CAddTime] AS [CAddTime]
FROM (SELECT TOP (1) [Extent1].[Id] AS [Id], [Extent1].[CId] AS [CId], [Extent1].[Name] AS [Name], [Extent1].[Gender] AS [Gender], [Extent1].[IsDel] AS [IsDel], [Extent1].[AddTime] AS [AddTime]
FROM [dbo].[Students] AS [Extent1]
WHERE 11 = [Extent1].[Id] ) AS [Limit1]
LEFT OUTER JOIN [dbo].[Classes] AS [Extent2] ON [Limit1].[CId] = [Extent2].[CID]

场景3:无连接查询 分两次sql查询【无Include】

 //3.无连接查询 分两次sql查询【无Include】
var stucc = db.Students.Where(t => t.Id == );
var zz = stucc.FirstOrDefault().Classes.CName;
 SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[CId] AS [CId],
[Extent1].[Name] AS [Name],
[Extent1].[Gender] AS [Gender],
[Extent1].[IsDel] AS [IsDel],
[Extent1].[AddTime] AS [AddTime]
FROM [dbo].[Students] AS [Extent1]
WHERE 11 = [Extent1].[Id]; SELECT
[Extent1].[CID] AS [CID],
[Extent1].[CName] AS [CName],
[Extent1].[CCount] AS [CCount],
[Extent1].[CImg] AS [CImg],
[Extent1].[CIsDel] AS [CIsDel],
[Extent1].[CAddTime] AS [CAddTime]
FROM [dbo].[Classes] AS [Extent1]
WHERE [Extent1].[CID] = @EntityKeyValue1

四.skip take

 //Skip 跳过序列中指定数量的元素,然后返回剩余的元素。
//Take 从序列的开头返回指定数量的连续元素。
//根据这两个方法可以 实现 分页效果

五.反射获取实例属性

 //利用反射 获取 类 对象 的所有公共 属性 默认是[GetProperties(BindingFlags.Instance | BindingFlags.Public)]
var listPro = typeof(Students).GetProperties().ToList();
object obj1 = new object();
object obj2 = new object();
listPro.ForEach(l =>
{
var newValue = l.GetValue(obj1); //获得某个对象的属性值
l.SetValue(obj2, newValue);//修改一个对象的属性 值
});

六.EF DLL数据访问帮助 父类

 using _00EFModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks; namespace _00EFDLL
{
/// <summary>
/// 数据访问 父类
/// </summary>
public class BaseDLL<Tclass> where Tclass : class,new()
{
/// <summary>
/// 数据访问上下文
/// </summary>
_00EFModel.Entities db = new _00EFModel.Entities(); #region 1.0添加数据 + Add(Tclass model)
/// <summary>
/// 1.0添加数据
/// </summary>
/// <param name="model"></param>
public void Add(Tclass model)
{
db.Set<Tclass>().Add(model);
}
#endregion #region 2.0 删除方法1 删除给定的对象 +Del(Tclass model)
/// <summary>
/// 2.0 删除方法1 删除给定的对象
/// </summary>
/// <param name="model"></param>
public void Del(Tclass model)
{
//将实体 添加到上下文
db.Set<Tclass>().Attach(model);
//把实体 标记为删除
db.Set<Tclass>().Remove(model);
}
#endregion #region 2.1 删除方法2 根据条件删除对象 +Del(Expression<Func<Tclass, bool>> delWhere)
/// <summary>
/// 2.1 删除方法2 根据条件删除对象
/// </summary>
/// <param name="delWhere"></param>
public void Del(Expression<Func<Tclass, bool>> delWhere)
{
//查询所有满足条件的实体对象
var modelS = db.Set<Tclass>().Where(delWhere).ToList();
modelS.ForEach(m =>
{
//附加到 上下文
db.Set<Tclass>().Attach(m);
//标记为 删除状态
db.Set<Tclass>().Remove(m);
});
}
#endregion #region 3.0 修改方法1 修改某个实体的 某些属性 +Up(Tclass model, params string[] strparams)
/// <summary>
/// 3.0 修改方法1 修改某个实体的 某些属性(根据id修改)【*用这个需要注意关闭检查】
/// </summary>
/// <param name="model"></param>
/// <param name="strparams">可变参数</param>
public int Up(Tclass model, params string[] strparams)
{
//关闭检查
db.Configuration.ValidateOnSaveEnabled = false;
//附加到上下文
var m = db.Entry<Tclass>(model);
//把全部属性标记为 没有修改
m.State = System.Data.Entity.EntityState.Unchanged;
for (int i = ; i < strparams.Length; i++)
{
//标记要修改的属性
m.Property(strparams[i]).IsModified = true;
}
int num = db.SaveChanges();
//打开检查
db.Configuration.ValidateOnSaveEnabled = true;
return num;
}
#endregion #region 3.1 修改方法2 根据条件 修改指定的 属性 值 +Up(Expression<Func<Tclass, bool>> upWhere, Tclass model, params string[] strparame)
/// <summary>
/// 3.1 修改方法2 根据条件 修改指定的 属性 值
/// </summary>
/// <param name="upWhere"></param>
/// <param name="model"></param>
/// <param name="strparame"></param>
public void Up(Expression<Func<Tclass, bool>> upWhere, Tclass model, params string[] strparame)
{
//查询出满足条件的所有实体
var modelS = db.Set<Tclass>().Where(upWhere).ToList();
//利用反射 获取 类 对象 的所有公共 属性 默认是[GetProperties(BindingFlags.Instance | BindingFlags.Public)]
var listPro = typeof(Tclass).GetProperties().ToList();
// 属性对象 键值对
List<PropertyInfo> dic = new List<PropertyInfo>();
listPro.ForEach(l =>
{
for (int i = ; i < strparame.Length; i++)
{
//循环 判断 添加 需要修改的 属性对象
if (l.Name == strparame[i].Trim())
{
dic.Add(l);
break;
}
}
}); if (dic.Count > )//判断 属性对象集合 是否 有 数据
{
foreach (var property in dic)
{
//取 传过来的对象 里面的值
var newValue = property.GetValue(model);
foreach (var mymodel in modelS)
{
//修改到 对象集合
property.SetValue(mymodel, newValue);
}
}
}
}
#endregion #region 4.0 查询方法 +GetList<Tkey>(Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
/// <summary>
/// 4.0 查询方法
/// </summary>
/// <typeparam name="Tkey"></typeparam>
/// <param name="strWhere">查询条件</param>
/// <param name="strOrederBy">排序条件</param>
/// <param name="order">是否升序</param>
/// <returns></returns>
public List<Tclass> GetList<Tkey>(Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
{
var t = db.Set<Tclass>().Where(strWhere);
if (strOrederBy != null)
{
if (order)
t = t.OrderBy(strOrederBy);
else
t = t.OrderByDescending(strOrederBy);
}
return t.ToList();
}
#endregion #region 4.1 查询方法2 分页查询 +GetList<Tkey>(int indexPage, int sizePage, Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
/// <summary>
/// 4.1 查询方法2 分页查询
/// </summary>
/// <typeparam name="Tkey"></typeparam>
/// <param name="indexPage">页码</param>
/// <param name="sizePage">页容量</param>
/// <param name="strWhere">查询条件</param>
/// <param name="strOrederBy">排序字段</param>
/// <param name="order">是否升序</param>
/// <returns></returns>
public List<Tclass> GetList<Tkey>(int indexPage, int sizePage, Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
{
var t = db.Set<Tclass>().Where(strWhere);
if (strOrederBy != null)
{
if (order)
t = t.OrderBy(strOrederBy);
else
t = t.OrderByDescending(strOrederBy);
}
return t.Skip((indexPage - ) * sizePage).Take(sizePage).ToList();
}
#endregion #region 提交 +save()
/// <summary>
/// 提交
/// </summary>
/// <returns></returns>
public int save()
{
return db.SaveChanges();
}
#endregion
}
}

MVC学习一:EF的更多相关文章

  1. MVC学习-用EF做增删改查

    在做增删改查先,先介绍几个知识点: 1.代理类 在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象, 同时为该对象的每一个属性添加一个标志:unchanged, 当对该对象某个属性进行操 ...

  2. MVC学习笔记(三)—用EF向数据库中添加数据

    1.在EFDemo文件夹中添加Controllers文件夹(用的是上一篇MVC学习笔记(二)—用EF创建数据库中的项目) 2.在Controllers文件夹下添加一个空的控制器(StudentsCon ...

  3. MVC学习系列4--@helper辅助方法和用户自定义HTML方法

    在HTML Helper,帮助类的帮助下,我们可以动态的创建HTML控件.HTML帮助类是在视图中,用来呈现HTML内容的.HTML帮助类是一个方法,它返回的是string类型的值. HTML帮助类, ...

  4. Asp.net MVC 学习系列(一)序

    题外话 公司本月开始提供早餐服务,2块天一餐,包括粥,两个包(听说是利口福供应的),一个鸡蛋.良心企业.公司原本有一个内部订餐系统,用Delphi开发的,开发的人早就走光了,也没有留下什么文档,现在项 ...

  5. ASP.NET MVC 学习第一天

    今天开始第一天学习asp.net mvc,写的不是很好,高手不要喷,希望大家能一起进步学习. 好了,开始学习 新建项目,选择mvc 4应用程序 接下来选择基本,视图引擎当然要选择Razor,如果在选择 ...

  6. (转)ASP.NET MVC 学习第一天

    天道酬勤0322   博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅  | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习as ...

  7. MVC中使用EF(2):实现基本的CRUD功能

    MVC中使用EF(2):实现基本的CRUD功能 By  Tom Dykstra |July 30, 2013 Translated by litdwg   Contoso University示例网站 ...

  8. MVC+UnitOfWork+Repository+EF

    MVC+UnitOfWork+Repository+EF UnitOfWork+Repository模式简介: 每次提交数据库都会打开一个连接,造成结果是:多个连接无法共用一个数据库级别的事务,也就无 ...

  9. 【.NET-MVC】ASP.NET MVC学习笔记1-概述

    第 1 篇:理解控制器和视图 MVC概述 MVC原理就是模型.视图.控制器的框架.   (其实也是种思想,为了让前端.程序.数据分开,也是想实现低耦合.高内聚) MVC请求流程是:访问控制器,控制器来 ...

  10. MVC学习手册之数据注解与验证

    MVC学习手册之数据注解与验证 新建一个MVC5的WEB应用程序,VS2013会自动生成一段代码,以下是Account控制器下Register.cshtml 页面的代码: @model WebAppl ...

随机推荐

  1. 攻城狮在路上(陆)-- hadoop分布式环境搭建(HA模式)

    一.环境说明: 操作系统:Centos6.5 Linux node1 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 ...

  2. Android 如何判断一个应用在运行(转)

    Android 如何判断一个应用在运行  在一个应用中,或一个Service .Receiver中判断一个应用是否正在运行,以便进行一些相关的处理. 这个时候我们需要得到一个ActivityManag ...

  3. CGI与fastcgi与php-fpm与php-cgi的关系

    cgi是一个协议,它规定了服务器Nginx会将那些数据传送给PHP-cgi fastcgi也可以说是一个协议.fastcgi是对cgi的性能的一次提高.fastcgi会先启动一个master,解析配置 ...

  4. Swift学习之熟悉控件

    最近是比较清闲一些的,对于一个开发者来说,这也是一个很好的充电机会.以前做项目都是使用Objective-C去开发,但我们都知道,Swift语言从2014年的出现到现在,一步一步变的完善,渐渐变的受欢 ...

  5. Python爬虫学习(11):Beautiful Soup的使用

    之前我们从网页中提取重要信息主要是通过自己编写正则表达式完成的,但是如果你觉得正则表达式很好写的话,那你估计不是地球人了,而且很容易出问题.下边要介绍的Beautiful Soup就可以帮你简化这些操 ...

  6. 可变参数列表与printf()函数的实现

    问题 当我们刚开始学习C语言的时候,就接触到printf()函数,可是当时"道行"不深或许不够细心留意,又或者我们理所当然地认为库函数规定这样就是这样,没有发现这个函数与普通的函数 ...

  7. servlet jsp jdbc bootstrarp mvc分层模式实现的第一个项目

    登录注册界面 这是一个注册和登录的界面 用到了前端页面中自带的一点H5的标签和属性---巩固下 邮箱格式 :type="email"  不能为空:  required=" ...

  8. fragment 重叠问题

    项目中用到了Android Fragment 在程序异常的时候 fragment 点击会造成fragment 重叠 在fragmentActivity中加入一下方法 @Override public ...

  9. PHP注册与登录【3】 用户登录与退出

    登录页面 login.html 负责收集用户填写的登录信息. <fieldset> <legend>用户登录</legend> <form name=&quo ...

  10. 使用nose 进行Python项目的自动化测试

    一.为什么使用nose? 编写测试更容易.nose可以自动识别继承于unittest.TestCase的测试单元,并执行测试,而且,nose也可以测试非继承于unittest.TestCase的测试单 ...