Я использую LINQ to SQL для обновления своей базы данных. Я вставляю много записей, и когда я вызываю SubmitChanges (), LINQ to SQL выполняет инструкции вставки и выбора для каждого объекта. Мне действительно не нужно обновлять свои объекты после того, как они будут вставлены в базу данных.
Знаете ли вы, что я могу запретить LINQ to SQL выдавать операторы выбора после операторов вставки? Это должно сделать мое приложение намного быстрее.





Я не могу вспомнить настройку сейчас, но в дизайнере в свойствах столбца у вас есть некоторые настройки «обновления».
Вы ищете ColumnAttribute.AutoSync. Если вы используете конструктор, проверьте каждый столбец на наличие свойства автосинхронизации и установите для него значение Никогда.
Редактировать: Хорошо, это не сработало для вас. Приготовьтесь к взлому карт!
Когда я вставляю с помощью некоторого автоматически сгенерированного столбца первичного ключа, я получаю этот SQL:
INSERT INTO [dbo].[TableName]( fieldlist )
VALUES (@p0, @p1, @p2, @p3, @p4)
SELECT CONVERT(Int,SCOPE_IDENTITY()) AS [value]
Насколько я понимаю ваш запрос, вы не хотите, чтобы SELECT
Попытка 1: я перешел в поле первичного ключа и установил для автоматического создания значение false. Это вызвало исключение Sql «Невозможно вставить явное значение для столбца идентификаторов в таблицу« TableName », когда для IDENTITY_INSERT установлено значение OFF». Другими словами, linq указывает значение для этого столбца.
Попытка 2: я удалил автоматически сгенерированные столбцы из дизайнера. Это привело к тому, что Linq выдал мне исключение недопустимой операции: «Невозможно выполнить операции создания, обновления или удаления для таблицы (TableName), потому что у нее нет первичного ключа».
Попытка 3. Я удалил автоматически сгенерированные столбцы из дизайнера, а затем пометил другой столбец как первичный ключ. Несмотря на то, что этот столбец не является первичным ключом в базе данных, DataContext LINQ будет использовать его для отслеживания идентичности строки. Он должен быть уникальным для наблюдаемых записей данного DataContext.
Эта третья попытка сгенерировала следующий SQL (это то, что вы просите)
INSERT INTO [dbo].[TableName]( fieldlist )
VALUES (@p0, @p1, @p2, @p3, @p4)
У меня есть два отмеченных столбца, для которых AutoGeneratedValue установлено значение true. Оператор select выбирает эти два столбца после вставок и обновлений, даже если AutoSync имеет значение false.
Кажется, это нелепый объем работы, чтобы сделать что-то, что сработало бы правильно при первом использовании ADO.Net.
then I marked another column as primary key - как это вообще возможно, поскольку этот столбец будет обновлен с помощью unique value с помощью запроса SQL, что, скорее всего, приведет к неверным данным.
@ViRuSTriNiTy «первичный ключ» и «идентичность» - это разные понятия, и если вы вмешиваетесь в сопоставления ORM, это поможет узнать разницу между ними.
Я знаю разницу. Позвольте мне сказать иначе: как обеспечить наличие must be unique без явной установки уникального значения для столбца, который не предназначен для хранения этого уникального значения?
@DavidB Спасибо, информация для отслеживания отсутствовала.
@ViRuSTriNiTy Не обязательно быть уникальным в таблице. Он должен быть уникальным только с точки зрения экземпляра DataContext и только в том случае, если этот контекст отслеживает изменения объектов. Если вы вставляете по одной записи за раз, вы уже выиграли. Если вы иногда читаете записи, вы можете отключить отслеживание объектов в этих случаях. Если вы обновляете или удаляете, то это намного сложнее. (фиксированная грамматика)
Однажды у меня была эта проблема с проектом. Я просто использовал context.ExecuteCommand ({здесь строка sql.}). Это была одна вставка, которая вызвала проблемы с производительностью. На мой взгляд, это самое простое исправление, легкое наблюдение и обслуживание, а не копание в модели.
Спасибо за предложение. Я сделал это, но профилировщик по-прежнему показывает выбор после вставки и обновления. Не знаю почему.