我使用的是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
似乎没有做它应该做的事情。我做错了什么?
感谢,
萨钦
答案 0 :(得分:1)
忽略代码的其他方面,这条线可能会成为一个问题:
else
{
CallSomeMethodThatAlsoCallsSaveChanges();
foo.Bat = SomeCalculatedValue();
}
// a few }} later...
SaveChanges();
执行此逻辑分支时,您的上下文的挂起更改将提交给DB(基于您提供的内容)。根据您创建和管理db上下文对象的方式,您已清除修改后的列表,或者您已引入潜在的更改冲突。在循环之后调用SaveChanges()
时,它可能会或可能没有挂起的更改提交(取决于条件逻辑是否调用其他方法)。
考虑使用此逻辑执行哪些逻辑单元工作,并使这些UoW保持原子分离。考虑如何创建,管理和传递数据库上下文,因为它们维护对象的本地状态。
如果您仍然遇到问题,可以发布更多代码,我们可以尝试进一步排查