C# 从linq select返回的实体框架数据不正确
我不熟悉使用实体框架,所以可能我做了一些非常错误的事情,但是下面的代码没有按照我预期的方式工作:C# 从linq select返回的实体框架数据不正确,c#,linq,entity-framework,C#,Linq,Entity Framework,我不熟悉使用实体框架,所以可能我做了一些非常错误的事情,但是下面的代码没有按照我预期的方式工作: PRODUCTEntities dbCustomerRefresh = new PRODUCTEntities(); Int16 delay = 5000; while(true) { var pendingFaults = (from f in dbCustomerRefresh.Faults where f.lRefreshStatus == 1 select f); forea
PRODUCTEntities dbCustomerRefresh = new PRODUCTEntities();
Int16 delay = 5000;
while(true)
{
var pendingFaults = (from f in dbCustomerRefresh.Faults where f.lRefreshStatus == 1 select f);
foreach(Fault f in pendingFaults)
{
log.DebugFormat("Initial refresh status for fault {0} is {1}", f.lFaultID.ToString(), f.lRefreshStatus.ToString());
f.lRefreshStatus = 2;
log.DebugFormat("Changed Refresh status for fault: {0} to {1}", f.lFaultID.ToString(),f.lRefreshStatus.ToString());
}
log.DebugFormat("Saved {0} rows to LOSCH Database",dbCustomerRefresh.SaveChanges().ToString());
Thread.Sleep(delay);
}
这在第一次循环中按预期工作,即它拾取数据库中lRefreshStatus设置为1的每一行,将其更改为2并将其打印到debug
然后,我进入数据库,手动将给定行的lRefreshStatus更改回1。在下一轮循环中,我的程序检测到状态再次改变,但变量中的初始值是错误的
2015-07-30 09:27:17,137 [10] DEBUG CustomerService - Initial refresh status for fault 101380 is 1
2015-07-30 09:27:17,137 [10] DEBUG CustomerService - Changed Refresh status for fault: 101380 to 2
2015-07-30 09:27:17,292 [10] DEBUG CustomerService - Saved 1 rows to PRODUCT Database
2015-07-30 09:27:22,297 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:27:27,304 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:27:32,313 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:27:37,318 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:27:42,327 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:27:47,336 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:27:52,341 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:27:57,346 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:28:02,356 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:28:07,361 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:28:12,366 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:28:17,371 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:28:22,378 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:28:27,384 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:28:32,390 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:28:37,396 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:28:42,405 [10] DEBUG CustomerService - Initial refresh status for fault 101380 is 2
2015-07-30 09:28:42,405 [10] DEBUG CustomerService - Changed Refresh status for fault: 101380 to 2
2015-07-30 09:28:42,405 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
2015-07-30 09:28:47,410 [10] DEBUG CustomerService - Initial refresh status for fault 101380 is 2
2015-07-30 09:28:47,410 [10] DEBUG CustomerService - Changed Refresh status for fault: 101380 to 2
2015-07-30 09:28:47,411 [10] DEBUG CustomerService - Saved 0 rows to PRODUCT Database
这很奇怪。select必须检测到故障状态的值已更改为1,否则它将不在pendingFaults变量中,但当我随后访问该属性时,它将设置为2
它不是第一次处理旧的f变量,然后在第二次循环中再次将其返回给我吗?像这样检查
PRODUCTEntities dbCustomerRefresh = new PRODUCTEntities();
Int16 delay = 5000;
while(true)
{
var pendingFaults = (from f in dbCustomerRefresh.Faults where f.lRefreshStatus == 1 select f);
foreach(Fault f in pendingFaults)
{
log.DebugFormat("Initial refresh status for fault {0} is {1}", f.lFaultID.ToString(), f.lRefreshStatus.ToString());
f.lRefreshStatus = 2;
log.DebugFormat("Changed Refresh status for fault: {0} to {1}", f.lFaultID.ToString(),f.lRefreshStatus.ToString());
log.DebugFormat("Saved {0} rows to LOSCH Database",dbCustomerRefresh.SaveChanges().ToString());
}
Thread.Sleep(delay);
}
看看是否有区别。像这样检查
PRODUCTEntities dbCustomerRefresh = new PRODUCTEntities();
Int16 delay = 5000;
while(true)
{
var pendingFaults = (from f in dbCustomerRefresh.Faults where f.lRefreshStatus == 1 select f);
foreach(Fault f in pendingFaults)
{
log.DebugFormat("Initial refresh status for fault {0} is {1}", f.lFaultID.ToString(), f.lRefreshStatus.ToString());
f.lRefreshStatus = 2;
log.DebugFormat("Changed Refresh status for fault: {0} to {1}", f.lFaultID.ToString(),f.lRefreshStatus.ToString());
log.DebugFormat("Saved {0} rows to LOSCH Database",dbCustomerRefresh.SaveChanges().ToString());
}
Thread.Sleep(delay);
}
看看是否有区别。查询缓存数据移动
PRODUCTEntities dbCustomerRefresh=new PRODUCTEntities()
进入循环如果我查询缓存数据,那么当我在后端手动更改数据时,为什么我的选择会返回任何内容?好吧,奇怪的是,如果将上下文的创建移动到循环中,会发生什么情况,仍然是相同的行为?这很有效,但是,每次我想要删除缓存行时,处理并创建一个新的dbcontext肯定不是正确的方法。对于一个非常小的操作来说,这似乎是一个非常大的开销。现在我们知道问题出在哪里了,请尝试在查询中使用AsNoTracking
,看看它是否会阻止数据缓存您查询缓存的数据移动PRODUCTEntities dbCustomerRefresh=new PRODUCTEntities()
进入循环如果我查询缓存数据,那么当我在后端手动更改数据时,为什么我的选择会返回任何内容?好吧,奇怪的是,如果将上下文的创建移动到循环中,会发生什么情况,仍然是相同的行为?这很有效,但是,每次我想要删除缓存行时,处理并创建一个新的dbcontext肯定不是正确的方法。对于一个非常小的操作来说,这似乎是非常大的开销。现在我们知道问题出在哪里了。请尝试在查询上使用AsNoTracking
,看看它是否会停止缓存System.data.EntityException:{“不允许新事务,因为会话中有其他线程运行。”}@JJ foreach循环是罪魁祸首,纠正它。详细信息请参阅帖子我之前看过这篇帖子。也许是因为我没有使用相同版本的EF,但这对我来说并不适用。值得注意的是,实体对象是DBContext,但在您给出的示例中,它是ObjectContext.System.Data.EntityException:{“不允许新事务,因为会话中有其他线程在运行。”}@JJ foreach循环是罪魁祸首,纠正它。详细信息请参阅帖子我之前看过这篇帖子。也许是因为我没有使用相同版本的EF,但这对我来说并不适用。值得注意的是,实体对象是DBContext,但在您给出的示例中,它是ObjectContext。