EF对象的行为

时间:2017-03-18 22:13:26

标签: c# entity-framework

每当我更改实体对象时,引用更改都会反映到指向同一实体的所有其他先前对象。例如:

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

此时如果我运行代码片段,则菜单和menu1都会更改。 这是因为实体的代理吗?我真的不明白。如果这两个对象中的Class对象有不同的名称......这怎么可能?

修改

更奇怪的是我尝试过的Orderby场景......

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

这两行实际上是在菜单对象中订购项目集合。

我甚至不必设置它们...... ???

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

1 个答案:

答案 0 :(得分:2)

EF在其上下文中仅保留同一对象的一个​​实例; FindByIdAsync检索Id = 12的项目,并在上下文中设置它的引用。第二次调用FindByIdAsync时,它会将上下文中的引用返回给同一对象。这就是为什么当您更改第一个对象中的属性时,第二个对象中的相应属性也会更改。

OrderBy不会返回有序的集合本身;返回的值是一个对象,它存储执行排序所需的所有信息。

直到通过直接调用其GetEnumerator方法或使用foreach枚举对象,才会执行排序。

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

不执行任何排序

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

执行排序,因为调用了ToList()