[英]How change tracking works in Entity Framework
給定以下代碼,EF / DbContext如何知道對客戶對象所做的更改:
class Program
{
static void Main()
{
using(var shopContext = new ShopContext())
{
var customer = shopContext.Customers.Find(7);
customer.City = "Marion";
customer.State = "Indiana";
shopContext.SaveChanges();
}
}
}
public class ShopContext : DbContext
{
public DbSet<Customer> Customers { get; set; }
}
public class Customer
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string City { get; set; }
public string State { get; set; }
}
謝謝
當您從上下文中加載實體時,它會保留一個額外的數據結構-我們稱其為條目。 該條目包含兩組值-原始值和當前值。 當您執行SaveChanges
操作時,EF會遍歷您的客戶實體並更新條目中的當前值,以便它們與您實體的真實狀態相匹配-此操作稱為檢測更改 。 在生成SQL命令期間,EF將比較當前值和原始值,並構建一條SQL更新語句以修改數據庫中已更改的值。 此操作稱為快照更改跟蹤 -EF將快照保留在條目中。
有一種稱為動態更改跟蹤的替代方法,它將在您將值分配給實體的屬性的同時修改條目中的當前值。 動態更改跟蹤具有特定要求(例如,實體中的所有屬性都必須是virtual
),因為它必須在運行時將類包裝到動態代理中。 這曾經是首選方法,但是由於復雜場景中的某些性能問題,快照更改跟蹤當前應該用作默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.