1

我正在使用 EF 4.2,并且遇到了一个随机发生且没有警告的问题。我有一个更新数据库的 Windows 服务。在服务中,我有一个计时器。当计时器的时间过去时,将调用一个方法。这是该方法的基本结构

IEnumerable<Foo> foos = GetFoosFromDB();
foreach (Foo foo in foos)
{
    if (some condition)
    {
        foo.Bar = 1;
    }
    if (some other condition)
    {
        foo.Bar = 2;
    }

    if (yet some other condition)
    {
        foo.Bar = 3;
    }
    else
    {
       int val = GetSomeValueFromDB();

        if (val == something)
        {
            if(GetSomeOtherValueFromDB())
            {
                foo.Bar = 4;
            } 
            else
            {
                CallSomeMethodThatAlsoCallsSaveChanges();
                foo.Bat = SomeCalculatedValue();
            }
        }
    }
}
SaveChanges();

现在,问题是,一旦我们开始使用数据库一天并且该数据库的表中有几行(我们只讨论 100 或 200 行),那么即使调用了这个方法,也SaveChanges不会t 似乎做它应该做的事。我究竟做错了什么?

谢谢,

萨钦

4

1 回答 1

1

忽略代码的其他方面,这一行可能是一个问题:

else
{
      CallSomeMethodThatAlsoCallsSaveChanges();
      foo.Bat = SomeCalculatedValue();
}
// a few }} later...
SaveChanges();

执行此逻辑分支时,您的上下文的未决更改将提交到数据库(基于您提供的内容)。根据您创建和管理数据库上下文对象的方式,您要么清除了修改列表,要么引入了潜在的更改冲突。当SaveChanges()在循环之后调用时,它可能有也可能没有待提交的更改(取决于条件逻辑是否调用了您的其他方法)。

考虑使用此逻辑正在执行哪些逻辑单元,并保持这些 UoW 原子分离。考虑如何创建、管理和传递数据库上下文,因为它们维护对象的本地状态。

如果您仍然遇到问题,您可以发布更多代码,我们可以尝试进一步排除故障

于 2012-07-18T17:17:29.283 回答