从linq选择返回的实体框架数据不正确

本文关键字:框架 数据 不正确 实体 linq 选择 返回 | 更新日期: 2023-09-27 18:05:43

我是使用实体框架的新手,所以也许我做错了什么,但是下面的代码没有按我期望的方式工作:

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

这在第一次循环中就像预期的那样工作,即它拾取DB中lRefreshStatus设置为1的每一行,将其更改为2并将其打印到调试中。

然后进入数据库,手动将给定行的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

奇怪。选择必须拾取故障状态的值已更改为1,否则它将不在pendingFaults变量中,但是当我随后访问该属性时,它被设置为2。

它不是从第一次开始处理旧的f变量,然后在第二次循环时再给我这个变量吗?

从linq选择返回的实体框架数据不正确

像这样检查

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