2017-03-18 45 views
2

每當我更改實體對象時,引用更改會反映到指向同一實體的所有其他先前對象。例如:EF對象行爲

var menu = menuRepo.FindByByIdAsync(12); 
    var menu1 = menuRepo.FindByByIdAsync(12); 
    menu.Name = "Name"; 
    Console.WriteLine(menu.Name+ " "+ menu1.Name); 

在這一點上,如果我運行代碼片斷菜單和menu1都改變了。 這是因爲實體的代理髮生了嗎?我真的不明白這一點。如果這兩個對象在類對象中會有不同的名字......這怎麼可能?

編輯

更奇怪的是排序依據的情況我都試過...

var menu = menuRepo.FindById(1); 
menu.MenuItems.OrderBy(m => m.OrderField).ToList(); 

這兩條線實際上責令項目集合菜單對象內。

我甚至不必設置它們......?

menu.MenuItems = menu.MenuItems.OrderBy(m => m.OrderField).ToList(); 
+1

嘗試檢查 'System.Diagnostics.Debug.Assert(菜單==菜單1)' 執行的排序 - 你應該發現它們是同一個對象。這是因爲EF緩存它們。 – PhillipH

+0

OrderBy 返回IOrderedEnumerable的新實例。它不會進行現場排序。我相信你的診斷是不正確的。 – PhillipH

回答

2

EF在其上下文中僅保留同一對象的一個​​實例; FindByIdAsync檢索Id = 12的項目並在上下文中設置它的引用。第二次調用FindByIdAsync時,它會從上下文返回一個對同一對象的引用。所以當你改變第一個對象的屬性時,第二個對象的相應屬性也會改變。

OrderBy dosen't return the ordered collection itself;返回的值是存儲執行排序所需的所有信息的對象。

直到通過直接調用GetEnumerator方法或使用foreach枚舉對象才能執行排序。

menu.MenuItems.OrderBy(m => m.OrderField) 

這麼想的執行任何種類

menu.MenuItems.OrderBy(m => m.OrderField).ToList(); 

因爲ToList()被調用