ITPub博客

首页 > IT职业 > IT职场 > MVC学习一:EF

MVC学习一:EF

IT职场 作者:skylar 时间:2021-09-09 09:44:48 0 删除 编辑

目录

一.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(s).State = System.Data.EntityState.Deleted;//标记删除4 int num = db.SaveChanges();

 

方法4:修改实体

图片描述

 1 //这里需要关闭验证 不然会报错 2 db.Configuration.ValidateOnSaveEnabled = false; 3 DbEntityEntry dbS = db.Entry(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     ///  13     /// 数据访问 父类   14     ///  15     public class BaseDLL where Tclass : class,new() 16     { 17         ///  18         /// 数据访问上下文 19         ///  20         _00EFModel.Entities db = new _00EFModel.Entities(); 21  22         #region 1.0添加数据 + Add(Tclass model) 23         ///  24         /// 1.0添加数据 25         ///  26         ///  27         public void Add(Tclass model) 28         { 29             db.Set().Add(model); 30         } 31         #endregion 32  33         #region  2.0 删除方法1 删除给定的对象 +Del(Tclass model) 34         ///  35         /// 2.0 删除方法1 删除给定的对象 36         ///  37         ///  38         public void Del(Tclass model) 39         { 40             //将实体 添加到上下文 41             db.Set().Attach(model); 42             //把实体 标记为删除 43             db.Set().Remove(model); 44         } 45         #endregion 46  47         #region  2.1 删除方法2 根据条件删除对象 +Del(Expression> delWhere) 48         ///  49         /// 2.1 删除方法2 根据条件删除对象  50         ///  51         ///  52         public void Del(Expression> delWhere) 53         { 54             //查询所有满足条件的实体对象 55             var modelS = db.Set().Where(delWhere).ToList(); 56             modelS.ForEach(m => 57             { 58                 //附加到 上下文 59                 db.Set().Attach(m); 60                 //标记为 删除状态 61                 db.Set().Remove(m); 62             }); 63         } 64         #endregion 65  66         #region 3.0 修改方法1 修改某个实体的 某些属性 +Up(Tclass model, params string[] strparams) 67         ///  68         /// 3.0 修改方法1 修改某个实体的 某些属性(根据id修改)【*用这个需要注意关闭检查】 69         ///  70         ///  71         /// 可变参数 72         public int Up(Tclass model, params string[] strparams) 73         { 74             //关闭检查 75             db.Configuration.ValidateOnSaveEnabled = false; 76             //附加到上下文 77             var m = db.Entry(model); 78             //把全部属性标记为 没有修改 79             m.State = System.Data.Entity.EntityState.Unchanged; 80             for (int i = 0; i > upWhere, Tclass model, params string[] strparame) 93         ///  94         /// 3.1 修改方法2 根据条件 修改指定的 属性 值 95         ///  96         ///  97         ///  98         ///  99         public void Up(Expression> upWhere, Tclass model, params string[] strparame)100         {101             //查询出满足条件的所有实体102             var modelS = db.Set().Where(upWhere).ToList();103             //利用反射 获取 类 对象 的所有公共 属性 默认是[GetProperties(BindingFlags.Instance | BindingFlags.Public)]104             var listPro = typeof(Tclass).GetProperties().ToList();105             // 属性对象 键值对106             List dic = new List();107             listPro.ForEach(l =>108             {109                 for (int i = 0; i  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         #endregion135 136         #region  4.0 查询方法 +GetList(Expression> strWhere, Expression> strOrederBy = null, bool order = true)137         /// 138         /// 4.0 查询方法 139         /// 140         /// 141         /// 查询条件142         /// 排序条件143         /// 是否升序144         /// 145         public List GetList(Expression> strWhere, Expression> strOrederBy = null, bool order = true)146         {147             var t = db.Set().Where(strWhere);148             if (strOrederBy != null)149             {150                 if (order)151                     t = t.OrderBy(strOrederBy);152                 else153                     t = t.OrderByDescending(strOrederBy);154             }155             return t.ToList();156         }157         #endregion158 159         #region 4.1 查询方法2 分页查询 +GetList(int indexPage, int sizePage, Expression> strWhere, Expression> strOrederBy = null, bool order = true)160         /// 161         /// 4.1 查询方法2 分页查询162         /// 163         /// 164         /// 页码165         /// 页容量166         /// 查询条件167         /// 排序字段168         /// 是否升序169         /// 170         public List GetList(int indexPage, int sizePage, Expression> strWhere, Expression> strOrederBy = null, bool order = true)171         {172             var t = db.Set().Where(strWhere);173             if (strOrederBy != null)174             {175                 if (order)176                     t = t.OrderBy(strOrederBy);177                 else178                     t = t.OrderByDescending(strOrederBy);179             }180             return t.Skip((indexPage - 1) * sizePage).Take(sizePage).ToList();181         }182         #endregion183 184         #region 提交 +save()185         /// 186         /// 提交187         /// 188         /// 189         public int save()190         {191             return db.SaveChanges();192         }193         #endregion194     }195 }

View Code

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4648/viewspace-2806790/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-08-13

  • 博文量
    83
  • 访问量
    766