Вставка и обновление с использованием Linq-2-SQL - PullRequest
0 голосов
/ 19 апреля 2009

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

В частности, я столкнулся с двумя различными проблемами.

Сначала я пытаюсь заполнить таблицу произвольным количеством строк. Схема в основном не имеет значения, но у нее есть первичный ключ BIGINT, который является столбцом идентификаторов.

Поскольку первичный ключ является идентификатором, я не устанавливаю его перед вызовом Table.InsertOnSubmit () или Table.InsertAllOnSubmit (), и я получаю исключение DuplicateKeyException: «Невозможно добавить объект с ключом, который уже используется. "

Моя вторая проблема связана с необходимостью в LINQ, эквивалентном следующему оператору SQL:

UPDATE dbo.someTable SET someCol = 'someValue' WHERE pkValue = 20

Если я сначала запрашиваю нужную строку, а затем изменяю значение someCol перед DataContext.SubmitChanges (), все в порядке. Однако я ищу решение, которое не требует, чтобы я сначала запросил строку. Другими словами, если первичный ключ является известным количеством, как это может быть выполнено?

Ответы [ 4 ]

1 голос
/ 19 апреля 2009

Я нашел ответы на свои вопросы.

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

Во-вторых, я определил, что следующий пример кода разрешает мою вторую проблему:

using( var dc = new MyDataContext() )
{
   TableValue row = new TableValue();
   row.pkValue = 20;
   dc.TableValues.Attach(row); // DataContext thinks 'row' is the original.

   row.someCol = "Changed Value";  // DataContext formats an UPDATE statement
   dc.SubmitChanges();
}

Предостережение заключается в том, что я должен установить для свойства «Проверка обновления» всех столбцов таблицы значение «Никогда», иначе оно вызывает исключения. Это заставляет меня чувствовать себя немного неловко и заставляет меня думать, что это не лучшее решение, но это может быть отчасти из-за моего непонимания фактической цели свойства «Проверка обновления».

1 голос
/ 19 апреля 2009

Глядя на вопрос, который указал Хосе, я получаю от него то, что люди получают ошибку, которую вы получаете, когда они пытаются вставить один и тот же объект дважды (что имеет смысл - первая вставка будет привязывать идентификатор и тогда второе обновление будет вставлять только что созданный идентификатор); Возможно ли, что вы отмечаете один и тот же объект для вставки при отправке два раза (или более)? Вы сказали, что вставляете «произвольное количество строк» ​​- почему бы вам не попробовать сбросить его до одной.

По сути, Linq to SQL должен обрабатывать ситуацию, о которой вы говорите, - в столбце Identity не должно быть заполненного значения, и вы вызываете InsertOnSubmit () и SubmitChanges, чтобы получить его.

Что касается вашего второго вопроса, я не думаю, что в Linq to SQL есть какой-то явный способ сделать то, что вы хотите. Вероятно, самое простое / лучшее решение для этого - иметь sproc, который обновляет нужные вам данные, и вызывать его, используя Linq to SQL (передавая идентификатор записи, который вы хотите обновить).

0 голосов
/ 05 февраля 2010

В ответ на ваш второй вопрос:

DataContext.someTable.Where(a => a.pkValue == 20).SingleOrDefault().someCol = 'someValue';
DataContext.SubmitChanges();
0 голосов
/ 19 апреля 2009

Для вашего первого Q: Ваш ПК автоматически увеличивается на DB?

Для вашего второго Q, если все правильно поняли, должно помочь следующее (взято из MSDN FAQ по L2S). Вы должны проверить следующее, поскольку у меня плохой опыт работы с MSDN ;-):

Q. Могу ли я обновить данные таблицы без первый запрос к базе данных?

A. Хотя LINQ to SQL не имеет команды обновления на основе набора, вы можете использовать любой из следующих методов для обновление без первого запроса:

Используйте ExecuteCommand для отправки кода SQL.

Создать новый экземпляр объекта и инициализировать все текущие значения (поля), которые влияют на обновление. затем прикрепить объект к DataContext с помощью Присоединить и изменить поле Вы хотите изменить.

Примечание от меня: для обновления без запросов вы должны будете убедиться, что DataContext не имеет загруженный объект уже.

...