实体框架SaveChanges并不总是有效

时间:2012-07-18 17:03:20

标签: c# sql-server-2008 entity-framework-4 ef-database-first

我使用的是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似乎没有做它应该做的事情。我做错了什么?

感谢,

萨钦

1 个答案:

答案 0 :(得分:1)

忽略代码的其他方面,这条线可能会成为一个问题:

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

执行此逻辑分支时,您的上下文的挂起更改将提交给DB(基于您提供的内容)。根据您创建和管理db上下文对象的方式,您已清除修改后的列表,或者您已引入潜在的更改冲突。在循环之后调用SaveChanges()时,它可能会或可能没有挂起的更改提交(取决于条件逻辑是否调用其他方法)。

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

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