我有一个类有这样的功能:
public string Code { get; set; }
public Dal.Foo GetFoo(Dal.MyContext ctx)
{
var obj = ctx.Foos.Where(f => f.Code == this.Code).FirstOrDefault();
return obj;
}
现在这通常工作正常。但是,我在另一个类中的另一个函数是这样调用它的:
using (var ctx = new Dal.MyContext())
{
var curr = parameters.Current.GetFoo(ctx);
var target = parameters.Target.GetFoo(ctx);
// ...
}
问题是 Current
和 Target
绝对是不同的对象,它们对于 Code
肯定有不同的值,但是当我执行这个代码,我最终得到了 curr
和 target
相同的对象!?! curr == target
返回 true
它真的不应该。我什至查看了从 GetFoo
方法生成的 SQL,它使用不同的参数正确地调用了数据库,并且在 SQL Server Management Studio 中执行这些命令会按预期返回两个不同的结果。我可以通过不给他们相同的上下文来解决这个问题(即将第二次调用放在它自己的 using
block 和新的 MyContext
中),但这真的不应该必要的。
这是怎么回事?
编辑:不确定这是否相关,但我应该指出我实际上是在访问 SQL Server 上的 View 而不是表。尽管如此,它仍然会生成看起来正确的 SQL,并为 Where
子句传递正确的参数。
另一个编辑:
我尝试在获取 obj
的行之后添加它:
System.Diagnostics.Debug.Assert(obj.Code == this.Code);
它通过了第一个调用,但在第二个调用中失败了。这似乎是不可能的。
最佳答案
Entity Framework 上下文是一个 identity map ,即它在数据库中保留每个实体的单个副本。即使从数据库中重新获取对象,EF 也不会修改本地副本中的值。我认为这是因为它会干扰更改跟踪,并且可能会覆盖同时进行的客户端更改。
所以根据设计,curr == target
和 Code
始终是从数据库中获取的第一个值,除非它在客户端代码中被修改(在这种情况下curr
和 target
显然都具有修改后的值)。
关于c# - Where 子句后跟 FirstOrDefault 返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29347641/