Entity Framework SaveChanges не всегда работает

Я использую 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 не кажется, не делает то, что должен делать. Что я делаю не так?

Благодарность,

Сачин


person Sachin Kainth    schedule 18.07.2012    source источник
comment
что у вас есть в лог-файлах?   -  person Turbot    schedule 18.07.2012
comment
Используют ли CallSomeMethodThatAlsoCallsSaveChanges и SaveChanges() разные экземпляры контекста?   -  person Gert Arnold    schedule 18.07.2012
comment
Боюсь, логов нет. Нет, они используют один и тот же контекст.   -  person Sachin Kainth    schedule 19.07.2012


Ответы (1)


Игнорируя другие аспекты кода, эта строка выделялась как вероятная проблема:

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

Когда эта логическая ветвь выполняется, ожидающие изменения вашего контекста фиксируются в БД (на основе того, что вы предоставили). В зависимости от того, как вы создаете объекты контекста базы данных и управляете ими, вы либо очистили измененный список, либо создали потенциальные конфликты изменений. Когда SaveChanges() вызывается после цикла, он может иметь или не иметь ожидающие изменения для фиксации (зависит от того, вызвала ли условная логика ваш другой метод).

Подумайте, какие логические единицы работы выполняются с помощью этой логики, и держите эти UoW атомарно разделенными. Подумайте о том, как создаются, управляются и передаются ваши контексты БД, поскольку они поддерживают локальное состояние ваших объектов.

Если у вас все еще есть проблемы, вы можете опубликовать больше своего кода, и мы можем попытаться устранить неполадки дальше.

person Josh E    schedule 18.07.2012