Entity framework EntityFramework 5返回相同的对象,而不是返回新对象

Entity framework EntityFramework 5返回相同的对象,而不是返回新对象,entity-framework,orm,entity-framework-5,Entity Framework,Orm,Entity Framework 5,考虑以下几点 数据库: Table: XFUNCTION ------------- |ID |NAME | ------------- |1 |F1 | ------------- |2 |F2 | ------------- Table: XSYSTEM ------------- |ID |NAME | ------------- |3 |S1 | ------------- |4 |S2 | ------------- Table: F

考虑以下几点

数据库:

Table: XFUNCTION
-------------
|ID  |NAME  |
-------------
|1   |F1    |
-------------
|2   |F2    |
-------------

Table: XSYSTEM
-------------
|ID  |NAME  |
-------------
|3   |S1    |
-------------
|4   |S2    |
-------------

Table: FUNCTION_HAS_SYSTEM
--------------------------------
|ID  |SYSTEM_ID  |FUNCTION_ID  |
--------------------------------
|5   |3          |1            |
--------------------------------
|6   |3          |2            |
--------------------------------
|7   |4          |1            |
--------------------------------
|8   |4          |2            |
--------------------------------
var dbContext = new EFContext();

var functions = dbContext.XFUNCTION; //Count == 2

var systems = new List<XSYSTEM>();

foreach(var func in functions)
{
    foreach(var sys in func.systems) //Count == 2
    {
        if (!systems.Contains(sys))
                    systems.Add(sys);
    }
}

Assert.IsTrue(systems.Count == 4);
代码:

Table: XFUNCTION
-------------
|ID  |NAME  |
-------------
|1   |F1    |
-------------
|2   |F2    |
-------------

Table: XSYSTEM
-------------
|ID  |NAME  |
-------------
|3   |S1    |
-------------
|4   |S2    |
-------------

Table: FUNCTION_HAS_SYSTEM
--------------------------------
|ID  |SYSTEM_ID  |FUNCTION_ID  |
--------------------------------
|5   |3          |1            |
--------------------------------
|6   |3          |2            |
--------------------------------
|7   |4          |1            |
--------------------------------
|8   |4          |2            |
--------------------------------
var dbContext = new EFContext();

var functions = dbContext.XFUNCTION; //Count == 2

var systems = new List<XSYSTEM>();

foreach(var func in functions)
{
    foreach(var sys in func.systems) //Count == 2
    {
        if (!systems.Contains(sys))
                    systems.Add(sys);
    }
}

Assert.IsTrue(systems.Count == 4);
var dbContext=new EFContext();
var functions=dbContext.XFUNCTION//计数==2
var systems=新列表();
foreach(函数中的var func)
{
foreach(函数系统中的变量sys)//Count==2
{
如果(!systems.Contains(sys))
添加(sys);
}
}
Assert.IsTrue(systems.Count==4);
Output:systems.Count==2而不是4

只要我没有覆盖
Equals()
GetHashCode()
我期望4个系统不是2个有人能告诉我EF为什么会这样做吗,是预期的吗?如何防止这种行为?

这个问题的原因是,当我试图在其中一个函数中操作系统对象时,没有执行
SaveChange()
。在另一个函数中,系统对象也发生了同样的情况。我知道它们在数据库中是相同的系统,但我希望它们是自己的对象,而不是在实体中共享。

object.Equals()返回true,因为EF返回相同的对象!EF将查询的实体保留在内存中,并在默认情况下重用它,除非禁用更改跟踪

有许多方法可以禁用更改跟踪:

1) 使用

2) 改变

但是,如果您只是要计算函数\u HAS\u系统中的总记录,只需这样做

dbContext.FUNCTION_HAS_SYSTEM.Count()

这似乎是对的。你只有两个系统,它们是相等的。即使您从不同的功能访问这些系统,系统仍然是一样的。如果您想要
系统。数到四,那么为什么不使用
函数\u HAS\u SYSTEM
?输出看起来不错!由于只有2个系统3和4,因此计数将为2。虽然它出现在函数_HAS_SYSTEM的4行中,但您正在检查(!systems.Contains(sys))是否会将系统仅添加一次到列表中。如果希望计数为4,请删除IF条件。Object.Equals()返回true,因为EF返回相同的对象!EF将查询的实体保留在内存中,并在默认情况下重用它,除非您禁用更改跟踪。好的,您已经清楚地回答了为什么会发生这种情况,但没有回答如何绕过它@Poornima如果我删除了if,列表将包含对2个对象的4个引用,这不是我想要的。如果我禁用ChangeTracking,我以后如何存储更改?我想我必须使用上下文重新蚀刻对象,并手动将其所有属性设置为未跟踪对象的值,然后调用
SaveChanges()
?您可以将实体附加到上下文。请参见本章中的“将现有但已修改的实体附加到上下文”。这是我尽量避免做的事情,因为它会变得复杂和低效。我的想法正是如此。我习惯于NHibernate,我不记得在这个问题上遇到过什么问题。是的,Hibernate和NHibernate没有更改跟踪功能,它们要求您实现Object。Equals不同于EF