Как убедиться, что Linq to Sql не переопределяет или нарушает ненулевые значения по умолчанию для БД? - PullRequest
14 голосов
/ 14 октября 2008

У меня есть БД SQL Server с таблицей с этими полями:

  1. A bit со значением по умолчанию 1, NOT NULL.
  2. A smalldatetime со значением по умолчанию gettime(), NOT NULL.
  3. An int без значения по умолчанию, IDENTITY, NOT NULL.

Когда я генерирую Linq to SQL для этой таблицы, происходит следующее:

  1. bit не предоставляется никакой специальной обработки.
  2. smalldatetime не предоставляется никакой специальной обработки.
  3. int помечен как IsDbGenerated.

Это означает, что когда я делаю вставки с использованием Linq to SQL, происходит следующее:

  1. bit будет отправлено как 0, переопределяя значение по умолчанию. правый
  2. smalldatetime будет отправлено как неинициализированный System.DateTime, что приведет к ошибке на сервере SQL, поскольку он не попадает в диапазон малого времени SQL Server. правый
  3. IsDbGenerated int не будет отправлено; БД сгенерирует значение, которое Linq to SQL затем прочитает обратно.

Какие изменения необходимо внести, чтобы этот сценарий работал?

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

РЕДАКТИРОВАТЬ: Ответ, кажется, это ограничение в текущем Linq для SQL.

Ответы [ 4 ]

5 голосов
/ 16 октября 2008

Сгенерированные классы Linq-To-Sql не получают константы значений по умолчанию.

Возможно, в будущем, но проблема в том, что ограничения не всегда являются простыми значениями, они также могут быть скалярными функциями, такими как GetDate(), поэтому linq каким-то образом должен будет знать, как их переводить. Короче говоря, он даже не пытается. Это также очень специфичный для базы данных тип вещей.

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

Проблема, с которой вы столкнулись, подробно описана в CodeProject - Установка значений по умолчанию для связанных данных LINQ

3 голосов
/ 18 октября 2008

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

Обходной путь, с которым я пошел, - это добавить метод SetDefaults (), очень похожий на метод, с которым Роберт Полсон связал в CodeProject, и вызвать его в конструкторе по умолчанию моего базового класса сущности таблицы. Это хорошо работает для меня, потому что 95% времени я устанавливаю 0, пустую строку или getdate ().

2 голосов
/ 14 октября 2008

Это означает, что когда я делаю вставки, используя Linq to SQL, следующее будет бывает:

  1. Бит будет отправлен как 0, переопределяя значение по умолчанию. Правильно? - Правильно
  2. smalldatetime будет отправлено как неинициализированный System.DateTime, выдает ошибку в SQL-сервере, так как это не падает с SQL Server маленький диапазон времени. Правильно? - отправляется DateTime.MinValue
  3. IsDbGenerated int не будет отправлено; БД будет генерировать значение который Linq to SQL затем прочитает обратно. - Если сгенерированная БД установлена, то значение создается базой данных, если нет, то Linq ожидает, что пользователь установит значение.

Лучше всего установить их в конструкторе объекта или в закрытых полях, если вы не используете автоматические свойства.

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

Вы можете создать другой файл для своего текста данных (частичный класс) и затем использовать частичные методы InsertYOURENTITY и UpdateYOURENTITY, чтобы проверить ваши свойства и назначить правильные значения. Вызовите ExecuteDynamicInsert или ExecuteDynamicUpdate после вашего кода, и все готово.

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