Отладка LINQ to SQL SubmitChanges () - PullRequest
       101

Отладка LINQ to SQL SubmitChanges ()

21 голосов
/ 17 сентября 2008

Мне очень трудно пытаться отлаживать LINQ to SQL и отправлять изменения.

Я использовал http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx,, который отлично подходит для отладки простых запросов.

Я работаю в классе DataContext для моего проекта со следующим фрагментом из моего приложения:

JobMaster newJobToCreate = new JobMaster();
newJobToCreate.JobID = 9999
newJobToCreate.ProjectID = "New Project";
this.UpdateJobMaster(newJobToCreate);
this.SubmitChanges();

Я поймаю некоторые очень странные исключения при запуске этого. SubmitChanges;

Index was outside the bounds of the array.

Трассировка стека идет туда, куда я не могу войти:

at System.Data.Linq.IdentityManager.StandardIdentityManager.MultiKeyManager`3.TryCreateKeyFromValues(Object[] values, MultiKey`2& k)
   at System.Data.Linq.IdentityManager.StandardIdentityManager.IdentityCache`2.Find(Object[] keyValues)
   at System.Data.Linq.IdentityManager.StandardIdentityManager.Find(MetaType type, Object[] keyValues)
   at System.Data.Linq.CommonDataServices.GetCachedObject(MetaType type, Object[] keyValues)
   at System.Data.Linq.ChangeProcessor.GetOtherItem(MetaAssociation assoc, Object instance)
   at System.Data.Linq.ChangeProcessor.BuildEdgeMaps()
   at System.Data.Linq.ChangeProcessor.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges(ConflictMode failureMode)
   at System.Data.Linq.DataContext.SubmitChanges()
   at JobTrakDataContext.CreateNewJob(NewJob job, String userName) in D:\JobTrakDataContext.cs:line 1119

Есть ли у кого-нибудь инструменты или методы, которые они используют? Я скучаю по чему-то простому?

EDIT : Я настроил отладку .net по предложению Slace, однако код .net 3.5 пока недоступен: http://referencesource.microsoft.com/netframework.aspx

EDIT2 : Я изменил на InsertOnSubmit согласно предложению sirrocco, все еще получая ту же ошибку.

EDIT3: Я реализовал предложения Сэма, пытаясь записать сгенерированный SQL и поймать исключение ChangeExceptoinException. Эти предложения не проливают больше света, я никогда не получаю генерировать SQL, когда выдается мое исключение.

EDIT4: Я нашел ответ, который работает для меня ниже. Это просто теория, но она исправила мою текущую проблему.

Ответы [ 19 ]

0 голосов
/ 10 октября 2008

Мы фактически прекратили использовать конструктор Linq to SQL для наших крупных проектов, и эта проблема является одной из основных причин. Мы также меняем множество значений по умолчанию для имен, типов данных и отношений, и время от времени дизайнер теряет эти изменения. Я никогда не нашел точную причину, и я не могу надежно воспроизвести ее.

Это, наряду с другими ограничениями, заставило нас отказаться от дизайнера и разработать классы вручную. После того, как мы привыкли к шаблонам, это на самом деле проще, чем использование дизайнера.

0 голосов
/ 05 июня 2009

Опубликовал мой опыт с этим исключением в ответе на SO # 237415

0 голосов
/ 15 апреля 2009

У меня была такая же не говорящая ошибка.

У меня было отношение внешнего ключа к столбцу таблицы, который был не первичным ключом таблицы, а уникальным столбцом. Когда я изменил уникальный столбец как первичный ключ таблицы, проблема исчезла.

Надеюсь, это кому-нибудь поможет!

0 голосов
/ 22 июля 2016

Я попал на этот вопрос при попытке отладки LINQ ChangeConflictException. В конце концов я понял, что проблема заключалась в том, что я вручную добавил свойство в таблицу в моем файле DBML, но я забыл установить такие свойства, как Nullable (должно было быть верно в моем случае) и Тип данных сервера

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 20 марта 2009

Я недавно столкнулся с той же проблемой: то, что я сделал, было

Proce proces = unit.Proces.Single(u => u.ProcesTypeId == (from pt in context.ProcesTypes
                                                                         where pt.Name == "Fix-O"
                                                                         select pt).Single().ProcesTypeId &&
                                                                      u.UnitId == UnitId);

Вместо:

Proce proces = context.Proces.Single(u => u.ProcesTypeId == (from pt in context.ProcesTypes
                                                                     where pt.Name == "Fix-O"
                                                                     select pt).Single().ProcesTypeId &&
                                                                  u.UnitId == UnitId);

Где контекст, очевидно, был объектом DataContext, а "unit" - экземпляром объекта Unit, класса данных из файла dbml.

Далее, я использовал объект «proc», чтобы установить свойство в экземпляре другого объекта класса данных. Возможно, механизм LINQ не смог проверить, было ли разрешено свойство, заданное мной для объекта «proc», в команде INSERT, которую LINQ собирался создать для добавления другого объекта класса данных в базу данных.

0 голосов
/ 10 февраля 2009

Убедитесь, что все столбцы «первичного ключа» в вашем dbml действительно связаны с первичными ключами в таблицах базы данных. У меня просто была ситуация, когда дизайнер решил поместить в dbml дополнительный столбец PK, что означало, что LINQ to SQL не смог найти обе стороны внешнего ключа при сохранении.

0 голосов
/ 17 сентября 2008

Хмм.

Если взять WAG (Wild Ass Guess), мне кажется, что LINQ - SQL пытается найти объект с идентификатором, который не существует, основываясь на создании класса JobMaster. Существуют ли внешние ключи, связанные с этой таблицей, так что LINQ to SQL будет пытаться получить экземпляр класса, который может не существовать? Вы, кажется, устанавливаете ProjectID нового объекта в строку - у вас действительно есть идентификатор, который является строкой? Если вы пытаетесь установить его для нового проекта, вам нужно создать новый проект и получить его идентификатор.

Наконец, что делает UpdateJobMaster? Может ли быть что-то такое, что применимо вышеизложенное?

0 голосов
/ 21 ноября 2018

Это давно, но у меня была та же проблема, и ошибка была из-за триггера с оператором select. Что-то вроде

CREATE TRIGGER NAME ON TABLE1 AFTER UPDATE AS SELECT table1.key from table1 
inner join inserted on table1.key = inserted.key

Когда linq-to-sql запускает команду обновления, она также запускает оператор select для получения автоматически сгенерированных значений в том же запросе и ожидает, что первый набор записей содержит столбцы, «запрошенные», но в этом случае первый строка была столбцами из оператора выбора в триггере. Таким образом, linq-to-sql ожидал двух автоматически сгенерированных столбцов, но получил только один столбец (с неверными данными), и это вызвало это исключение.

0 голосов
/ 10 октября 2008

Ранее сегодня я отправил аналогичный вопрос здесь: Странное исключение LINQ (Индекс за пределами) .

Это другой вариант использования - когда эта ошибка возникает во время SubmitChanges (), моя происходит во время простого запроса, но это также ошибка индекса вне диапазона.

Перекрестная публикация в этом вопросе в случае, если комбинация данных в вопросах помогает хорошему самаритянскому ответу:)

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