2009-11-12 5 views
0

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

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(); и строки будут вставлены в этот момент точно, а не раньше, а не некоторый код впоследствии.

ответ

1

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

+0

Это действительно так. У меня 20 вставок. Несомненно, причина в том, что мое поле DataContext хранится следующим образом; public static FWHDataContext db = new FWHDataContext(); Я ввел следующий код; ChangeSet cs = db.GetChangeSet(); db.GetChangeSet(). Inserts.Clear(); cs = db.GetChangeSet(); Первоначально, чтобы установить точки останова и посмотреть, что происходит. У всех, кто очищал вставки, был неожиданный удар по эффектам. Какое оптимальное решение для этого? – arame3333

+0

Почему статический DataContext? Это кажется опасным. DataContexts предназначены для легкого использования, поэтому вы можете создавать их везде, где вам нужно. Лучше создавать и уничтожать их кучу раз, чем держать лежащего во всем. – roufamatic

+0

Вы правы, он не должен быть статичным. Я изменил это сейчас. – arame3333

2

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

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

+0

Это полезно. Теперь я понимаю DataContext намного лучше. – arame3333

+0

Как мы конкурируем с первой причиной? у меня нет выбора, я должен вставить новый объект, содержащий другие связанные объекты (entitiyref), из-за внешних ключей –

Смежные вопросы