某個項目里的update代碼是類似這樣的
public T Update<T>(T entity) where T : ModelBase { var set = this.Set<T>(); set.Attach(entity); this.Entry<T>(entity).State = EntityState.Modified; this.SaveChanges(); return entity; }
當運行的時候EF在UPDATE的時候會自動更新所有字段,這樣就會增加不少麻煩
例如我們在頁面里編輯數據保存的時候只希望更新提交的數據,沒有POST的字段希望保持不變,例如createtime(創建時間),hit(點擊數量)等。
於是我想到在UPDATE的時候遍歷entity對象的所有屬性,不是null的屬性標記為Modified=true,這樣在SaveChanges的時候只會更新非NULL的字段了。大致代碼如下:
public T Update<T>(T entity) where T : ModelBase { var set = this.Set<T>(); set.Attach(entity); foreach (System.Reflection.PropertyInfo p in entity.GetType().GetProperties()) { if (p.GetValue(entity) != null) { this.Entry<T>(entity).Property(p.Name).IsModified = true; } } this.SaveChanges(); return entity; }
這樣處理后目前運行良好,如果有更好的辦法請告訴我。