C# · 12月 21, 2021

EF只更新变化的字段

摘要

在使用EF的时候,由于表字段较多,所以在更新的时候,想要只更新变化的字段,有没有办法呢?

解决办法

代码片段

Task UpdateAsync(T entity,List ( context = </span><span style=”color: #0000ff;”&gt;if</span> (fieldNames != <span style=”color: #0000ff;”&gt;null</span> &amp;&amp; fieldNames.Count > <span style=”color: #800080;”&gt;0</span><span style=”color: #000000;”&gt;) { context.Set</span><T><span style=”color: #000000;”&gt;().Attach(entity); </span><span style=”color: #0000ff;”&gt;foreach</span> (<span style=”color: #0000ff;”&gt;var</span> item <span style=”color: #0000ff;”&gt;in</span><span style=”color: #000000;”&gt; fieldNames) { context.Entry</span><T>(entity).Property(item).IsModified = <span style=”color: #0000ff;”&gt;true</span><span style=”color: #000000;”&gt;; } } </span><span style=”color: #0000ff;”&gt;else</span><span style=”color: #000000;”&gt; { context.Entry</span><T>(entity).State =<span style=”color: #000000;”&gt; Sy<a href=”https://www.jb51.cc/tag/stem/” target=”_blank” class=”keywords”>stem</a>.Data.Entity.EntityState.Modified; } </span><span style=”color: #0000ff;”&gt;return</span> <span style=”color: #0000ff;”&gt;await</span><span style=”color: #000000;”&gt; context.SaveChangesAsync(); } }</span></pre>

将变化的字段名称放在集合中,并修改其是否变化的状态。

Task UpdateAsync(T entity,Dictionary </span><span style=”color: #0000ff;”&gt;if</span> (dic != <span style=”color: #0000ff;”&gt;null</span><span style=”color: #000000;”&gt;) { SetValue</span><T><span style=”color: #000000;”&gt;(dic,entity); </span><span style=”color: #0000ff;”&gt;return</span> <span style=”color: #0000ff;”&gt;await</span><span style=”color: #000000;”&gt; _baseData.UpdateAsync(entity,dic.Keys.ToList()); } </span><span style=”color: #0000ff;”&gt;else</span><span style=”color: #000000;”&gt; { </span><span style=”color: #0000ff;”&gt;return</span> <span style=”color: #0000ff;”&gt;await</span> _baseData.UpdateAsync(entity,<span style=”color: #0000ff;”&gt;null</span><span style=”color: #000000;”&gt;); } } </span><span style=”color: #0000ff;”&gt;catch</span><span style=”color: #000000;”&gt; (Exception ex) { </span><span style=”color: #0000ff;”&gt;throw</span><span style=”color: #000000;”&gt; ex; } }</span></pre> SetValue(Dictionary dic,T entity) T : ,== ( item ( key (key.ToLower() == = dic[key] == ? Guid() : } } } }</span></pre>

通过反射的方式对变化的字段进行赋值。字段中保存变化的字段名称与值。