<span class="token keyword keyword-using">using</span> <span class="token namespace">Microsoft<span class="token punctuation">.</span>EntityFrameworkCore</span><span class="token punctuation">;</span>
<span class="token keyword keyword-using">using</span> <span class="token namespace">Microsoft<span class="token punctuation">.</span>EntityFrameworkCore<span class="token punctuation">.</span>Diagnostics</span><span class="token punctuation">;</span>
<span class="token keyword keyword-using">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Threading</span><span class="token punctuation">;</span>
<span class="token keyword keyword-using">using</span> <span class="token namespace">System<span class="token punctuation">.</span>Threading<span class="token punctuation">.</span>Tasks</span><span class="token punctuation">;</span>
<span class="token keyword keyword-public">public</span> <span class="token keyword keyword-class">class</span> <span class="token class-name">SoftDeleteInterceptor</span> <span class="token punctuation">:</span> <span class="token type-list"><span class="token class-name">SaveChangesInterceptor</span></span>
<span class="token punctuation">{</span>
<span class="token keyword keyword-public">public</span> <span class="token keyword keyword-override">override</span> <span class="token return-type class-name">InterceptionResult<span class="token punctuation"><</span><span class="token keyword keyword-int">int</span><span class="token punctuation">></span></span> <span class="token function">SavingChanges</span><span class="token punctuation">(</span>
<span class="token class-name">DbContextEventData</span> eventData<span class="token punctuation">,</span>
<span class="token class-name">InterceptionResult<span class="token punctuation"><</span><span class="token keyword keyword-int">int</span><span class="token punctuation">></span></span> result<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SoftDeleteEntities</span><span class="token punctuation">(</span>eventData<span class="token punctuation">.</span>Context<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword keyword-return">return</span> <span class="token keyword keyword-base">base</span><span class="token punctuation">.</span><span class="token function">SavingChanges</span><span class="token punctuation">(</span>eventData<span class="token punctuation">,</span> result<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword keyword-public">public</span> <span class="token keyword keyword-override">override</span> <span class="token return-type class-name">ValueTask<span class="token punctuation"><</span>InterceptionResult<span class="token punctuation"><</span><span class="token keyword keyword-int">int</span><span class="token punctuation">></span><span class="token punctuation">></span></span> <span class="token function">SavingChangesAsync</span><span class="token punctuation">(</span>
<span class="token class-name">DbContextEventData</span> eventData<span class="token punctuation">,</span>
<span class="token class-name">InterceptionResult<span class="token punctuation"><</span><span class="token keyword keyword-int">int</span><span class="token punctuation">></span></span> result<span class="token punctuation">,</span>
<span class="token class-name">CancellationToken</span> cancellationToken <span class="token operator">=</span> <span class="token keyword keyword-default">default</span><span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token function">SoftDeleteEntities</span><span class="token punctuation">(</span>eventData<span class="token punctuation">.</span>Context<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword keyword-return">return</span> <span class="token keyword keyword-base">base</span><span class="token punctuation">.</span><span class="token function">SavingChangesAsync</span><span class="token punctuation">(</span>eventData<span class="token punctuation">,</span> result<span class="token punctuation">,</span> cancellationToken<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword keyword-private">private</span> <span class="token return-type class-name"><span class="token keyword keyword-void">void</span></span> <span class="token function">SoftDeleteEntities</span><span class="token punctuation">(</span><span class="token class-name">DbContext<span class="token punctuation">?</span></span> context<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
<span class="token keyword keyword-if">if</span> <span class="token punctuation">(</span>context <span class="token operator">==</span> <span class="token keyword keyword-null">null</span><span class="token punctuation">)</span> <span class="token keyword keyword-return">return</span><span class="token punctuation">;</span>
<span class="token class-name"><span class="token keyword keyword-var">var</span></span> entries <span class="token operator">=</span> context<span class="token punctuation">.</span>ChangeTracker<span class="token punctuation">.</span><span class="token generic-method"><span class="token function">Entries</span><span class="token generic class-name"><span class="token punctuation"><</span>ISoftDelete<span class="token punctuation">></span></span></span><span class="token punctuation">(</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">Where</span><span class="token punctuation">(</span>e <span class="token operator">=></span> e<span class="token punctuation">.</span>State <span class="token operator">==</span> EntityState<span class="token punctuation">.</span>Deleted<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword keyword-foreach">foreach</span> <span class="token punctuation">(</span><span class="token class-name"><span class="token keyword keyword-var">var</span></span> entry <span class="token keyword keyword-in">in</span> entries<span class="token punctuation">)</span>
<span class="token punctuation">{</span>
entry<span class="token punctuation">.</span>State <span class="token operator">=</span> EntityState<span class="token punctuation">.</span>Modified<span class="token punctuation">;</span>
entry<span class="token punctuation">.</span>Entity<span class="token punctuation">.</span>IsDeleted <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>