<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hasibul Islam SHaanTO</title>
    <description>The latest articles on DEV Community by Hasibul Islam SHaanTO (@bdshanto).</description>
    <link>https://dev.to/bdshanto</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F494288%2F040d4156-a25e-41ae-815f-64ae2abf679f.jpeg</url>
      <title>DEV Community: Hasibul Islam SHaanTO</title>
      <link>https://dev.to/bdshanto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bdshanto"/>
    <language>en</language>
    <item>
      <title>EF Core: AsNoTracking() vs AsNoTrackingWithIdentityResolution() 🔍</title>
      <dc:creator>Hasibul Islam SHaanTO</dc:creator>
      <pubDate>Thu, 19 Mar 2026 12:04:56 +0000</pubDate>
      <link>https://dev.to/bdshanto/ef-core-asnotracking-vs-asnotrackingwithidentityresolution-1mlo</link>
      <guid>https://dev.to/bdshanto/ef-core-asnotracking-vs-asnotrackingwithidentityresolution-1mlo</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8jkkwwhmthokoiz9g56.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8jkkwwhmthokoiz9g56.webp" alt="AsNoTracking() vs AsNoTrackingWithIdentityResolution()" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Most developers know &lt;code&gt;AsNoTracking()&lt;/code&gt; — but not everyone knows when it can silently cause bugs. Let's break down the difference and when you should be using each. 👇&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚡ AsNoTracking()
&lt;/h2&gt;

&lt;p&gt;This method skips the EF Core Change Tracker completely. &lt;br&gt;
→ &lt;strong&gt;The result:&lt;/strong&gt; Faster execution, less memory usage, and great performance for read-only queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The catch:&lt;/strong&gt; If two related entities point to the same row in the database (e.g., two &lt;code&gt;Order&lt;/code&gt; records that share the same &lt;code&gt;Customer&lt;/code&gt;), EF Core creates &lt;strong&gt;duplicate objects in memory&lt;/strong&gt; instead of one shared instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ⚠️ Potential memory/reference trap&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTracking&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// If Order 1 and Order 2 belong to the same Customer, &lt;/span&gt;
&lt;span class="c1"&gt;// EF Core creates TWO separate Customer objects in memory.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 AsNoTrackingWithIdentityResolution()
&lt;/h2&gt;

&lt;p&gt;This gives you the same speed and memory benefits as standard no-tracking, but with one massive difference: &lt;strong&gt;EF Core ensures the same database row = the same object instance.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No duplicates. No weird reference bugs. This is especially useful when using &lt;code&gt;.Include()&lt;/code&gt; on shared related entities.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csharp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// ✅ The safe way to read related data&lt;/span&gt;
&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;dbContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Orders&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;Include&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Customer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;AsNoTrackingWithIdentityResolution&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ToList&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="c1"&gt;// If Order 1 and Order 2 belong to the same Customer, &lt;/span&gt;
&lt;span class="c1"&gt;// both orders will point to the EXACT SAME Customer object in memory.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  📌 The Simple Rule Cheat Sheet
&lt;/h2&gt;

&lt;p&gt;Keep this quick reference in mind for your next EF Core project:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Use Case&lt;/th&gt;
&lt;th&gt;Method to Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Simple reads, no &lt;code&gt;.Include()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AsNoTracking()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reads with related data via &lt;code&gt;.Include()&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AsNoTrackingWithIdentityResolution()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Updating or Deleting entities&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Default Tracking&lt;/strong&gt; (Don't use NoTracking)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Small detail. Big difference in correctness. 🚀&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which one do you find yourself using the most in your repositories? Drop a comment below! 👇&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>dotnet</category>
      <category>efcore</category>
      <category>csharp</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
