Asp.Net MVC EF之二:原生EF插入,更新資料的正確方法

來源:互聯網
上載者:User

標籤:das   blog   防止   架構   padding   foreach   導致   asn   tor   

引言

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/聲明:本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。

Asp.Net MVC EF之二:原生EF插入,更新資料的正確方法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.