【发布时间】:2015-03-30 13:34:43
【问题描述】:
我有一个类有这样的功能:
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 块中,并带有一个新的MyContext),但这确实没有必要。
这里发生了什么?
编辑:不确定这是否相关,但我应该提到我实际上是在访问 SQL 服务器上的视图而不是表。尽管如此,它仍在生成看起来正确的 SQL,并为 Where 子句传递正确的参数。
另一个编辑:
我尝试在获得obj 的行之后添加这个:
System.Diagnostics.Debug.Assert(obj.Code == this.Code);
它在第一次调用时通过,在第二次调用时失败。这似乎是不可能的。
【问题讨论】:
-
据我所见,您正在访问同一上下文
ctx的同一对象Foos,独立于Current和Target。为什么会和自己不同? -
@Thaoden,请注意他正在通过
this.Code进行过滤,它将为不同的类实例保存不同的值 -
@GiorgiNakeuri 我的错
-
@Matt Burland,在调试模式下,当您在
var obj = ctx.Foos.Where(f => f.Code == this.Code).FirstOrDefault();上有断点时,那里的一切都正确吗?你看到不同的代码吗?您还看到退货线上有不同的退货对象吗?你可能会更好地发布你是如何创建你的课程的吗?还有and fails on the second可以添加异常抛出吗? -
是哪个 EF 版本?您是否尝试过从 linq 查询中删除
this.Code并使用值为 this.code 的局部变量?
标签: c# entity-framework sql-server-2012