Asp.Net MVC EF之二:原生EF插入,更新數據的正確方法,EF更新數據將之前修改的欄位也還原了 ...
引言
EF是相對與Dapper、NHibernate官方首推的ORM框架,其在開發過程中的方便,快捷毋庸置疑的,但由於EF本身的一些緩存機制、跟蹤機制,所以在使用時有些地方需要特別註意。
下麵我將自己在項目中的總結的一些經驗 分享出來,希望能幫助大家正確的使用EF。
正文
1. 插入數據
不建議的做法:
dbcontext.entity.Add(_entity); dbcontext.SaveChanges();
正確的做法:
dbcontext.Entry<TEntity>(entity).State = EntityState.Added; dbcontext.SaveChanges();
.SaveChanges() 會返回一個受影響條數的Int值
2. 更新數據
不建議的做法:
var entity = dbcontext.Set<TEntity>().FirstOrDefault(predicate); //predicate表示唯一查詢的Lambda表達式,當參數查詢不唯一時,次表達式只會取第一條 entity.t_Name = "張三2"; dbcontext.SaveChanges();
註意:此種做法 必須將主鍵傳遞進來重新查詢一遍,防止與其他加了.AsNoTracking()的方法混用,.AsNoTracking()的作用是放棄對EF對象的跟蹤,這樣對屬性進行重新賦值後,調用.SaveChanges()將會失效。
正確的做法:
var entity = dbcontext.Set<TEntity>().Single(predicate); //predicate表示唯一查詢的Lambda表達式,當參數查詢不唯一時,將會報錯 entity.t_Name = "張三2"; dbcontext.Set<TEntity>().Attach(entity); dbcontext.Entry(entity).Property(a => a.t_Name).IsModified = true; //將EF對t_Name的管理狀態設置為是一個更新 dbcontext.SaveChanges();
上面的做法必將導致如果要改多個欄位,就必須重覆的對IsModified進行設置。
我們進一步對修改方法做一個封裝,封裝方法如下:
public int Update(TEntity entity) { dbcontext.Set<TEntity>().Attach(entity); PropertyInfo[] props = entity.GetType().GetProperties(); foreach (PropertyInfo prop in props) { if (prop.GetValue(entity, null) != null) { if (prop.GetValue(entity, null).ToString() == " ") dbcontext.Entry(entity).Property(prop.Name).CurrentValue = null; dbcontext.Entry(entity).Property(prop.Name).IsModified = true; } } return dbcontext.SaveChanges(); }
TEntity:表示一個泛型類,對泛型類還不瞭解的朋友可以百度一下泛型類或者閱讀這篇文章 C#中泛型類,泛型方法,泛型約束實際應用 補一補。
之後我會出一篇對EF處理機制的詳細介紹,提供給大家參考,也是對自己知識經驗的一個總結!
PS:歡迎掃描下方二維碼,加入QQ群
作者:Jacky 來源:https://www.cnblogs.com/ydcnblog/ 聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。