每当我更改实体对象时,引用更改都会反映到指向同一实体的所有其他先前对象。例如:
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();
答案 0 :(得分:2)
EF在其上下文中仅保留同一对象的一个实例; FindByIdAsync检索Id = 12的项目,并在上下文中设置它的引用。第二次调用FindByIdAsync时,它会将上下文中的引用返回给同一对象。这就是为什么当您更改第一个对象中的属性时,第二个对象中的相应属性也会更改。
OrderBy不会返回有序的集合本身;返回的值是一个对象,它存储执行排序所需的所有信息。
直到通过直接调用其GetEnumerator方法或使用foreach枚举对象,才会执行排序。
menu.MenuItems.OrderBy(m => m.OrderField)
不执行任何排序
menu.MenuItems.OrderBy(m => m.OrderField).ToList();
执行排序,因为调用了ToList()