版权所有,禁止匿名转载;禁止商业使用。
一.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 } }