Обновление LInq также вставляет ненужные строки - PullRequest
0 голосов
/ 12 ноября 2009

Я новичок в Linq to SQL, но меня удивляют проблемы с обновлением таблицы. Читая различные источники, я думаю, что проблема, которую я получаю, связана с отображением ORM, но даже в этом случае, учитывая, что я использую VS 2008 и создаю свой dbml через класс LINQ to SQL, я не ожидаю этого. Итак, что происходит, когда я обновляю и / или вставляю строку, в таблице также создается много других строк. Я не могу предсказать, что такое паттерн, когда это происходит, иногда этого не происходит. Я не уверен, что приведенный ниже код говорит о том, в чем проблема, но я воспроизвожу ее здесь;

    public static void UpdateDailyTimeRecorded(
        int dailyTimeRecordedId, bool amFlag, string timeIn, string timeOut)
    {
        DailyTimeRecorded dtr = GetDailyTimeRecorded(dailyTimeRecordedId);
        if (amFlag == true)
        {
            dtr.MorningTimeIn_HH = Convert.ToInt32(timeIn.Substring(0, 2));
            dtr.MorningTimeIn_MM = Convert.ToInt32(timeIn.Substring(3, 2));
            dtr.MorningTimeOut_HH = Convert.ToInt32(timeOut.Substring(0, 2));
            dtr.MorningTimeOut_MM = Convert.ToInt32(timeOut.Substring(3, 2));
            dtr.MorningLeaveFlagId = 0;
        }
        else
        {
            dtr.AfternoonTimeIn_HH = Convert.ToInt32(timeIn.Substring(0, 2));
            dtr.AfternoonTimeIn_MM = Convert.ToInt32(timeIn.Substring(3, 2));
            dtr.AfternoonTimeOut_HH = Convert.ToInt32(timeOut.Substring(0, 2));
            dtr.AfternoonTimeOut_MM = Convert.ToInt32(timeOut.Substring(3, 2));
            dtr.AfternoonLeaveFlagId = 0;
        }
        try
        {
            db.SubmitChanges();
        }
        catch (ChangeConflictException)
        {
            db.ChangeConflicts.ResolveAll(RefreshMode.KeepChanges);
        }
    }

Я поставил точку останова на строке db.SubmitChanges (); и строки вставляются в этот момент наверняка, не раньше и не в некоторый код позже.

Ответы [ 2 ]

2 голосов
/ 12 ноября 2009

Одна из причин, о которых мне известно, что из-за того, что LINQ может вставить неожиданные данные, заключается в следующем. Даже если вы явно не добавляете строку данных в конкретную таблицу, LINQ to SQL неявно добавит ее, если у вас есть ссылка на другой объект, который вы добавили .

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

1 голос
/ 12 ноября 2009

Позвоните DataContext.GetChanges() и посмотрите, что еще захвачено. Это может быть из предыдущего «не зафиксированного» действия в контексте данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...