2011-10-18 78 views
2

我有這樣的代碼,它使用實體框架4.1來訪問數據庫實體:如何在不更改該對象的所有實例的情況下更新實體框架對象?

public string Test() 
    { 
     Navigation nav = db.Navigations.FirstOrDefault(); 
     List<Navigation> lNav = db.Navigations.ToList(); 

     foreach (var item in lNav) 
     { 
      item.Label += " [Edited]"; 
     } 

     return nav.Label; 
    } 

當我在asp.net mvc的運行這個它返回:

News [Edited] 

我希望它返回:

News 

因爲我以爲我的foreach只會修改lNav的內容。相反,它似乎修改了實體對象的所有實例。

如何在不修改nav的情況下修改lNav

回答

1

嘗試AsNoTracking()

Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault(); 
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList(); 

這種方式加載實體沒有連接到環境和兩種不同的情況下,應第一實體的創建。通過使用AsNoTracking,可以禁用實體的鍵值與負責所觀察行爲的對象引用之間的標識映射。 (在上下文中總是隻能有一個實體引用,並且EF不會創建新對象,而是使用相同的密鑰加載實體,而是返回上下文中已存在的對象。)

請注意,如果您打算使用EFs更改跟蹤機制來更新實體,則不能使用此功能。 AsNoTracking()專爲只讀場景而設計。

+0

我可以只在'lNav'列表上使用'AsNoTracking()'嗎?因爲我將來需要更新'nav'。我還沒有寫下那部分。我要去嘗試一下。 – quakkels

+0

啊是的!添加了'AsNoTracking()'到'lNAv',它效果很好! – quakkels

相關問題