Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从linq select返回的实体框架数据不正确_C#_Linq_Entity Framework - Fatal编程技术网

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。