c# - Where 子句后跟 FirstOrDefault 返回相同的值

标签 c# entity-framework sql-server-2012

我有一个类有这样的功能:

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);
    // ...
}

问题是 CurrentTarget 绝对是不同的对象,它们对于 Code 肯定有不同的值,但是当我执行这个代码,我最终得到了 currtarget 相同的对象!?! 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 == targetCode 始终是从数据库中获取的第一个值,除非它在客户端代码中被修改(在这种情况下currtarget 显然都具有修改后的值)。

关于c# - Where 子句后跟 FirstOrDefault 返回相同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29347641/

相关文章:

c# - 如何让 Entity Framework 6 在 CSDL 中使用 SQL STUFF 函数?

wpf - 为什么在我的WPF应用程序中有时会发生此 Entity Framework 崩溃?

sql - 将两个 SQL 查询结果合并为一个结果

sql - 动态旋转 SQL Server 2012

c# - 在 StartUri 不可用的子文件夹中实现的窗口

c# - 您如何跟踪线程/线程上下文?

entity-framework - 在扩展方法中使用时,DbSet<T>.Include() 会导致 SELECT N+1

c# - 避免异步方法的事件委托(delegate)重新创建

c# - nhibernate 连接表和自定义类型

sql - 比较相同 ID 的两个最近的列