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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM