2012-04-30 45 views
27

考慮下面的代碼,如何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; } 
} 

謝謝

+3

對於新讀取器,此博客文章可能會有所幫助:http://blog.oneunicorn.com/2012/03/10/secrets-of-detectchanges-part-1-what-does-detectchanges-do/ – Karsten

回答

45

當加載實體從上下文中它保留了一個額外的數據結構 - 讓我們稱之爲條目。該條目包含兩組值 - 原始值和當前值。當您執行SaveChanges操作時,EF將通過客戶實體並更新條目中的當前值,以便它們與實體的實際狀態相匹配 - 此操作稱爲,用於檢測的更改。在生成SQL命令期間,EF會比較當前值和原始值,並構建SQL更新語句以修改數據庫中的更改值。此操作被稱爲快照更改跟蹤 - EF在條目中保持快照。

還有一種叫做的動態變更跟蹤,它可以在您爲實體屬性賦值的同時修改條目中的當前值。動態更改跟蹤具有特定要求(如實體中的所有屬性必須爲virtual),因爲它必須在運行時將您的類包裝爲動態代理。這曾經是首選的方法,但由於複雜場景中的一些性能問題,快照更改跟蹤目前應該被用作默認值。

+0

嗨,上下文如何知道客戶對象?它如何連接/鏈接? –

+0

上下文知道它,因爲您通過調用'Customers.Find'通過相同的上下文實例檢索到客戶對象 –

+0

這是一個參考嗎? –