MVC学习一:EF

目录

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

二.标准查询where

三.include

四.skip take

五.反射获取实例属性

六.EF DLL数据访问帮助类

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

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

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

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

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

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

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

方法4:修改实体

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

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

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

三.include

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

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

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

1 //2手动 内连接查询【有Include】
2 var stu2 = db.Students.Include("Classes").Where(t => t.Id == 11);
3 var ccc = stu2.FirstOrDefault().Classes.CName;
 1 SELECT
 2 [Limit1].[Id] AS [Id],
 3 [Limit1].[CId] AS [CId],
 4 [Limit1].[Name] AS [Name],
 5 [Limit1].[Gender] AS [Gender],
 6 [Limit1].[IsDel] AS [IsDel],
 7 [Limit1].[AddTime] AS [AddTime],
 8 [Extent2].[CID] AS [CId1],
 9 [Extent2].[CName] AS [CName],
10 [Extent2].[CCount] AS [CCount],
11 [Extent2].[CImg] AS [CImg],
12 [Extent2].[CIsDel] AS [CIsDel],
13 [Extent2].[CAddTime] AS [CAddTime]
14 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]
15     FROM [dbo].[Students] AS [Extent1]
16     WHERE 11 = [Extent1].[Id] ) AS [Limit1]
17 LEFT OUTER JOIN [dbo].[Classes] AS [Extent2] ON [Limit1].[CId] = [Extent2].[CID]

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

1 //3.无连接查询 分两次sql查询【无Include】
2 var stucc = db.Students.Where(t => t.Id == 11);
3 var zz = stucc.FirstOrDefault().Classes.CName;
 1 SELECT TOP (1)
 2 [Extent1].[Id] AS [Id],
 3 [Extent1].[CId] AS [CId],
 4 [Extent1].[Name] AS [Name],
 5 [Extent1].[Gender] AS [Gender],
 6 [Extent1].[IsDel] AS [IsDel],
 7 [Extent1].[AddTime] AS [AddTime]
 8 FROM [dbo].[Students] AS [Extent1]
 9 WHERE 11 = [Extent1].[Id];
10
11 SELECT
12 [Extent1].[CID] AS [CID],
13 [Extent1].[CName] AS [CName],
14 [Extent1].[CCount] AS [CCount],
15 [Extent1].[CImg] AS [CImg],
16 [Extent1].[CIsDel] AS [CIsDel],
17 [Extent1].[CAddTime] AS [CAddTime]
18 FROM [dbo].[Classes] AS [Extent1]
19 WHERE [Extent1].[CID] = @EntityKeyValue1

四.skip take

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

五.反射获取实例属性

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

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

  1 using _00EFModel;
  2 using System;
  3 using System.Collections.Generic;
  4 using System.Linq;
  5 using System.Linq.Expressions;
  6 using System.Reflection;
  7 using System.Text;
  8 using System.Threading.Tasks;
  9
 10 namespace _00EFDLL
 11 {
 12     /// <summary>
 13     /// 数据访问 父类
 14     /// </summary>
 15     public class BaseDLL<Tclass> where Tclass : class,new()
 16     {
 17         /// <summary>
 18         /// 数据访问上下文
 19         /// </summary>
 20         _00EFModel.Entities db = new _00EFModel.Entities();
 21
 22         #region 1.0添加数据 + Add(Tclass model)
 23         /// <summary>
 24         /// 1.0添加数据
 25         /// </summary>
 26         /// <param name="model"></param>
 27         public void Add(Tclass model)
 28         {
 29             db.Set<Tclass>().Add(model);
 30         }
 31         #endregion
 32
 33         #region  2.0 删除方法1 删除给定的对象 +Del(Tclass model)
 34         /// <summary>
 35         /// 2.0 删除方法1 删除给定的对象
 36         /// </summary>
 37         /// <param name="model"></param>
 38         public void Del(Tclass model)
 39         {
 40             //将实体 添加到上下文
 41             db.Set<Tclass>().Attach(model);
 42             //把实体 标记为删除
 43             db.Set<Tclass>().Remove(model);
 44         }
 45         #endregion
 46
 47         #region  2.1 删除方法2 根据条件删除对象 +Del(Expression<Func<Tclass, bool>> delWhere)
 48         /// <summary>
 49         /// 2.1 删除方法2 根据条件删除对象
 50         /// </summary>
 51         /// <param name="delWhere"></param>
 52         public void Del(Expression<Func<Tclass, bool>> delWhere)
 53         {
 54             //查询所有满足条件的实体对象
 55             var modelS = db.Set<Tclass>().Where(delWhere).ToList();
 56             modelS.ForEach(m =>
 57             {
 58                 //附加到 上下文
 59                 db.Set<Tclass>().Attach(m);
 60                 //标记为 删除状态
 61                 db.Set<Tclass>().Remove(m);
 62             });
 63         }
 64         #endregion
 65
 66         #region 3.0 修改方法1 修改某个实体的 某些属性 +Up(Tclass model, params string[] strparams)
 67         /// <summary>
 68         /// 3.0 修改方法1 修改某个实体的 某些属性(根据id修改)【*用这个需要注意关闭检查】
 69         /// </summary>
 70         /// <param name="model"></param>
 71         /// <param name="strparams">可变参数</param>
 72         public int Up(Tclass model, params string[] strparams)
 73         {
 74             //关闭检查
 75             db.Configuration.ValidateOnSaveEnabled = false;
 76             //附加到上下文
 77             var m = db.Entry<Tclass>(model);
 78             //把全部属性标记为 没有修改
 79             m.State = System.Data.Entity.EntityState.Unchanged;
 80             for (int i = 0; i < strparams.Length; i++)
 81             {
 82                 //标记要修改的属性
 83                 m.Property(strparams[i]).IsModified = true;
 84             }
 85             int num = db.SaveChanges();
 86             //打开检查
 87             db.Configuration.ValidateOnSaveEnabled = true;
 88             return num;
 89         }
 90         #endregion
 91
 92         #region 3.1 修改方法2 根据条件 修改指定的 属性 值 +Up(Expression<Func<Tclass, bool>> upWhere, Tclass model, params string[] strparame)
 93         /// <summary>
 94         /// 3.1 修改方法2 根据条件 修改指定的 属性 值
 95         /// </summary>
 96         /// <param name="upWhere"></param>
 97         /// <param name="model"></param>
 98         /// <param name="strparame"></param>
 99         public void Up(Expression<Func<Tclass, bool>> upWhere, Tclass model, params string[] strparame)
100         {
101             //查询出满足条件的所有实体
102             var modelS = db.Set<Tclass>().Where(upWhere).ToList();
103             //利用反射 获取 类 对象 的所有公共 属性 默认是[GetProperties(BindingFlags.Instance | BindingFlags.Public)]
104             var listPro = typeof(Tclass).GetProperties().ToList();
105             // 属性对象 键值对
106             List<PropertyInfo> dic = new List<PropertyInfo>();
107             listPro.ForEach(l =>
108             {
109                 for (int i = 0; i < strparame.Length; i++)
110                 {
111                     //循环 判断 添加 需要修改的 属性对象
112                     if (l.Name == strparame[i].Trim())
113                     {
114                         dic.Add(l);
115                         break;
116                     }
117                 }
118             });
119
120             if (dic.Count > 0)//判断 属性对象集合  是否 有 数据
121             {
122                 foreach (var property in dic)
123                 {
124                     //取 传过来的对象 里面的值
125                     var newValue = property.GetValue(model);
126                     foreach (var mymodel in modelS)
127                     {
128                         //修改到 对象集合
129                         property.SetValue(mymodel, newValue);
130                     }
131                 }
132             }
133         }
134         #endregion
135
136         #region  4.0 查询方法 +GetList<Tkey>(Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
137         /// <summary>
138         /// 4.0 查询方法
139         /// </summary>
140         /// <typeparam name="Tkey"></typeparam>
141         /// <param name="strWhere">查询条件</param>
142         /// <param name="strOrederBy">排序条件</param>
143         /// <param name="order">是否升序</param>
144         /// <returns></returns>
145         public List<Tclass> GetList<Tkey>(Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
146         {
147             var t = db.Set<Tclass>().Where(strWhere);
148             if (strOrederBy != null)
149             {
150                 if (order)
151                     t = t.OrderBy(strOrederBy);
152                 else
153                     t = t.OrderByDescending(strOrederBy);
154             }
155             return t.ToList();
156         }
157         #endregion
158
159         #region 4.1 查询方法2 分页查询 +GetList<Tkey>(int indexPage, int sizePage, Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
160         /// <summary>
161         /// 4.1 查询方法2 分页查询
162         /// </summary>
163         /// <typeparam name="Tkey"></typeparam>
164         /// <param name="indexPage">页码</param>
165         /// <param name="sizePage">页容量</param>
166         /// <param name="strWhere">查询条件</param>
167         /// <param name="strOrederBy">排序字段</param>
168         /// <param name="order">是否升序</param>
169         /// <returns></returns>
170         public List<Tclass> GetList<Tkey>(int indexPage, int sizePage, Expression<Func<Tclass, bool>> strWhere, Expression<Func<Tclass, Tkey>> strOrederBy = null, bool order = true)
171         {
172             var t = db.Set<Tclass>().Where(strWhere);
173             if (strOrederBy != null)
174             {
175                 if (order)
176                     t = t.OrderBy(strOrederBy);
177                 else
178                     t = t.OrderByDescending(strOrederBy);
179             }
180             return t.Skip((indexPage - 1) * sizePage).Take(sizePage).ToList();
181         }
182         #endregion
183
184         #region 提交 +save()
185         /// <summary>
186         /// 提交
187         /// </summary>
188         /// <returns></returns>
189         public int save()
190         {
191             return db.SaveChanges();
192         }
193         #endregion
194     }
195 }

说明:此类文章仅供本人学习记录使用。如有2B的错误,欢迎指出。不喜勿喷!

时间: 2024-10-17 13:22:10

MVC学习一:EF的相关文章

MVC学习-用EF做增删改查

在DbContext中有两个很重要的方法: 一.几个方法的说明 1.一个是Entry()方法: public DbEntityEntry<TEntity> Entry<TEntity>(TEntity entity) where TEntity : class; 可以将 任何类型的数据放入到上下文对象中 DbEntityEntry有个 属性EntityState,它可以为上下文中的对象做标识,并依照标识的值做相应的sql操作 public enum EntityState { De

Asp.Net Core2.0+Vs2017+MVC 学习 五 EF

介绍一下EF的使用. 一. 创建数据库,设置连接字符串 方便起见,这里直接用LocalDB,打开VS,点击视图->SQL Server对象资源管理器,如果有这种localdb开头的实例,就说明安装了LocalDB. 在数据库下面创建一个LessonDB作为学习数据库,右键属性可以获取到它的连接字符串,复制出来,在appseetings.json中配置一下,然后先放着不管. "ConnectionStrings": { "DefaultConnection":

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

天道酬勤0322 博客园 | 首页 | 发新随笔 | 发新文章 | 联系 | 订阅  | 管理 随笔:10 文章:0 评论:9 引用:0 ASP.NET MVC 学习第一天 今天开始第一天学习asp.net mvc,写的不是很好,高手不要喷,希望大家能一起进步学习. 好了,开始学习 新建项目,选择mvc 4应用程序 接下来选择基本,视图引擎当然要选择Razor,如果在选择aspx那我们就没必要用mvc喽 在这里我们简单说一下,项目模板如果选择空,这就需要我们自己进行导入很多文件,而选择基本vs会

ASP.NET MVC 学习第一天

今天开始第一天学习asp.net mvc,写的不是很好,高手不要喷,希望大家能一起进步学习. 好了,开始学习 新建项目,选择mvc 4应用程序 接下来选择基本,视图引擎当然要选择Razor,如果在选择aspx那我们就没必要用mvc喽 在这里我们简单说一下,项目模板如果选择空,这就需要我们自己进行导入很多文件,而选择基本vs会自动导入需要的文件,对mvc不熟的人,还是先老实一点吧. 后面两个Internet.Intranet一个是网络web,一个是内网的.没有用过,也不是很了解.移动选项应该是开发

ASP.NET MVC学习---(五)MVC初体验

经过之前n多的铺垫 我们已经大概了解了这个姓m名vc的家伙了 那么今天我们就来体验一把 怎么体验呢? 就来做一个小例子吧~ mvc增删改查的例子 数据库还是之前我们的老朋友 关系图: 表中的数据已填好 T_Users 将就着用着吧,哈哈 现在要求对T_Users表进行增删改查 开搞~ 回到之前新建的mvc项目 在Controllers文件夹下新建一个名为Home的空控制器 当浏览器请求Home下面的Index方法的时候返回什么? 当然是主页面啦 这里我们的主页面就是显示T_Users数据列表 代

ASP.NET MVC 学习第二天

今天使用mvc完成简单的增删改,内容比较简单,来熟悉一下mvc,数据库操作是用前面的ef,也算是温习一下ef吧. 新建mvc项目,在项目中的Models内添加ef,我这里只操作一下简单的user表.里面有id,name,sex,age字段.完成后如下 在Controller中添加user控制器,添加增删改查方法,下面是我在user控制器中添加的方法 1 using System; 2 using System.Collections.Generic; 3 using System.Data.En

Spring MVC 学习笔记(二):@RequestMapping用法详解

一.@RequestMapping 简介 在Spring MVC 中使用 @RequestMapping 来映射请求,也就是通过它来指定控制器可以处理哪些URL请求,相当于Servlet中在web.xml中配置 <servlet>     <servlet-name>servletName</servlet-name>     <servlet-class>ServletClass</servlet-class> </servlet>

ASP.NET MVC学习系列(二)-WebAPI请求

继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现数据调用. 继续使用上一文章中的示例,添加一个index.html页面,添加对jquery的引用. 一.无参数Get请求 一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:"get"}) 来实现: 请求的后台Action方法仍为上篇文章中的GetU

MVC学习笔记索引帖

[MVC学习笔记]1.项目结构搭建及单个类在各个层次中的实现 [MVC学习笔记]2.使用T4模板生成其他类的具体实现 [MVC学习笔记]3.使用Spring.Net应用IOC(依赖倒置) [MVC学习笔记]4.使用Log4Net来进行错误日志的记录 [MVC学习笔记]5.使用Controller来代替Filter完成登录验证(Session校验) [MVC学习笔记]6. 使用Memcache+Cookie解决分布式系统共享登录状态 [MVC学习笔记]7.使用极验验证来制作更高逼格的验证码

ASP.NET MVC学习之控制器篇

一.前言 许久之后终于可以继续我的ASP.NET MVC连载了,之前我们全面的讲述了路由相关的知识,下面我们将开始控制器和动作的讲解. ASP.NET MVC学习之路由篇幅(1) ASP.NET MVC学习之路由篇幅(2) ASP.NET MVC学习之路由篇幅(3) 二.正文 1.IController的使用 这个接口可能很多人都没有使用过,但是我们常用的Controller类实现了这个接口,而且只要实现这个接口就可以作为一个控制器,当然很多的内部的处理就要我们自己去做了. 下面我利用ICont