ВСТАВКА с помощью Linq, пропускающая некоторые «поддельные» столбцы

#sql-server-2008 #linq-to-sql

#sql-server-2008 #linq-to-sql

Вопрос:

У меня есть таблица в базе данных со следующими столбцами: ID, Name, Txt . Мы используем Linq To Sql для реализации нашего DAL. Там другой коллега добавил два дополнительных столбца, поэтому в коде получается та же таблица: ID, Name, Txt, NameTemp, TxtTemp .

Эти две «поддельные» таблицы используются в разных частях кода в соединениях LINQ, и при анализе с помощью SQL Profiler проанализированный SQL-запрос принимает «настоящие» столбцы, и все работает правильно. Теперь мне нужно сделать ВСТАВКУ, используя эту таблицу, но я получаю исключение, поскольку в инструкции также используются поддельные столбцы.

Поскольку я не могу добавить два поддельных столбца в БД (поскольку они там бесполезны), есть ли способ, которым я мог бы сделать вставку с Linq, опуская эти два столбца?

Ответ №1:

Кажется, я знаю, к чему вы клоните. Вы должны иметь возможность добавлять свойства к частичному классу linq без проблем, единственное, что если вы попытаетесь использовать запрос linq к этим «поддельным» столбцам, вы получите исключение, когда linqtosql попытается сослаться на столбец, которого не существует в базе данных. Я проходил через это раньше — я хотел иметь возможность выбирать столбцы, которые не существуют в базе данных (но есть в классе linq2sql dbml), и чтобы linq2sql преобразовал столбцы в то, что они действительно есть в базе данных. Единственная проблема заключается в том, что нет простого способа сделать это — вы можете добавить атрибуты к «поддельным» свойствам, чтобы linq2sql думал, что NameTmp и TxtTmp на самом деле являются Name и Txt в мире sql, единственная проблема в том, что когда дело доходит до вставки записи, переведенный sql указываетодин и тот же столбец дважды (что SQL не нравится и выдает исключение).

Вы можете пометить столбец с помощью IsDbGenerated = true — это позволит вам вставлять записи без возникновения проблемы с двойным столбцом, но вы не можете обновить запись без жалобы linqtosql на то, что вы не можете обновить вычисляемый столбец. Я думаю, вы можете использовать sproc, чтобы обойти это, возможно?

Некоторое время назад я зарегистрировал ошибку в Microsoft, которую они никогда не исправят. Приведенная здесь информация может помочь вам получить то, что вам нужно —

http://social.msdn.microsoft.com/Forums/eu/linqtosql/thread/5691e0ad-ad67-47ea-ae2c-9432e4e4bd46

https://connect.microsoft.com/VisualStudio/feedback/details/526402/linq2sql-doesnt-like-it-when-you-wrap-column-properties-with-properties-in-an-interface

Комментарии:

1. Привет, Фрэнк, спасибо за полезную информацию. Я думаю, что я разработаю sp.

Ответ №2:

LINQ предназначен не для вставки данных, а для запроса только встроенного запроса на языке. Используйте ADO.NET для вставки данных.

(Оставляя первую часть, чтобы напомнить о моей глупости) Проверьте ScottGu. Созданные классы являются частичными (упомянутыми здесь ), поэтому вы можете поместить свои 2 свойства в редактируемую часть, и поскольку у них не будет определенного атрибута сопоставления, они не будут сопоставлены и не будут сохранены.

Комментарии:

1. Это комментарий, а не ответ.

2. Это ответ — Luca не может вставлять данные с помощью LINQ.

3. Означает ли это, что я также не могу вставлять данные, используя язык структурированных запросов ? Linq to SQL — это ORM, и он определенно позволяет вставлять данные.

4. Извините, мой плохой, Лука, проверьте это weblogs.asp.net/scottgu/archive/2007/07/11 /. … Если эти 2 свойства не являются частью схемы (они не являются столбцами БД), то они не будут сохранены (для них нет столбца).

5. Они являются частью схемы, поскольку используются в качестве ключей в контексте данных.