MVC学习一:EF

版权所有,禁止匿名转载;禁止商业使用。

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


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


 var student = db.Students.FirstOrDefault(t => t.Id == Mid);
 student.Name = "修改后";//修改值数据
 db.SaveChanges();//保存 
 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() >= 1)
 {
     //成功
 }

方法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 >= 1)
 {
     //修改成功
 }

二.标准查询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 == 11);
 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 == 11);
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 = 0; 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 = 0; i < strparame.Length; i++)
                 {
                     //循环 判断 添加 需要修改的 属性对象
                     if (l.Name == strparame[i].Trim())
                     {
                         dic.Add(l);
                         break;
                     }
                 }
             });
 
             if (dic.Count > 0)//判断 属性对象集合  是否 有 数据
             {
                 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 - 1) * sizePage).Take(sizePage).ToList();
         }
         #endregion
 
         #region 提交 +save()
         /// <summary>
         /// 提交
         /// </summary>
         /// <returns></returns>
         public int save()
         {
             return db.SaveChanges();
         }
         #endregion
     }
 }


0 0