使用EF做更新時,若沒有進行跟蹤會預設全欄位更新,那怎麼做到只更新我們想要更新的欄位呢? 使用:如下,更新表Model中Status和UpdateTime欄位 有的同學會發現,調用的時候使用了_dbContext.SaveChangesAsync(),為什麼不直接集成到方法裡面呢?這個就因需求而變化 ...
使用EF做更新時,若沒有進行跟蹤會預設全欄位更新,那怎麼做到只更新我們想要更新的欄位呢?
1 /// <summary> 2 /// 修改指定屬性的單條數據 3 /// </summary> 4 /// <typeparam name="T">實體</typeparam> 5 /// <param name="context">上下文</param> 6 /// <param name="model">要修改的實體信息</param> 7 /// <param name="expression">指定修改的欄位</param> 8 public static void Modify<T>(this DbContext context, T model, Expression<Func<T, object>> expression) 9 where T : class 10 { 11 context.Update(model); 12 //4.1將 對象 添加到 EF中 13 var entry = context.Entry<T>(model); 14 //4.2先設置 對象的包裝 狀態為 Unchanged 15 entry.State = EntityState.Unchanged; 16 //4.3迴圈 被修改的屬性名 數組 17 foreach (var proInfo in expression.GetPropertyAccessList()) 18 { 19 if (!string.IsNullOrEmpty(proInfo.Name)) 20 //4.4將每個 被修改的屬性的狀態 設置為已修改狀態;後面生成update語句時,就只為已修改的屬性 更新 21 entry.Property(proInfo.Name).IsModified = true; 22 } 23 }
使用:如下,更新表Model中Status和UpdateTime欄位
1 _dbContext.Modify(Model, p => new 2 { 3 p.Status, 4 p.UpdateTime 5 }); 6 await _dbContext.SaveChangesAsync();
有的同學會發現,調用的時候使用了_dbContext.SaveChangesAsync(),為什麼不直接集成到方法裡面呢?這個就因需求而變化了,如果你的項目中不涉及到多張表的變化,不需要做一些事務性的處理,那集成到一個方法裡面完全沒有問題,也支持這麼做。