Asp.Net MVC 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處理機制的詳細介紹,提供給大家參考,也是對自己知識經驗的一個總結!

 

 


免責聲明!

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



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