Подтвердить что ты не робот

Как использовать значение столбца Default из базы данных в Entity Framework?

У меня есть столбец Date в таблице, который имеет значение по умолчанию или привязку как getutcdate(). Я хочу использовать это в сущности framework.On генерации EDM я смог найти свойство "Значение по умолчанию" на уровне столбца, но я думаю, что это для жестко заданного значения.

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

4b9b3361

Ответ 1

Реализация события OnCreated для объекта - это решение, которое я нашел. У меня было свойство Guid, которое я хотел заселить. По умолчанию он заполнялся всеми нулями (00000-0000-00000 и т.д.). Добавив следующее к моему частичному классу объекта, я смог решить проблему.

partial void OnCreated()
{
    Guid = Guid.NewGuid();
}

Ответ 2

StoreGeneratedPattern = "Computed" - это не то же самое, что и значение по умолчанию, потому что это свойство будет обновляться в любое время со значением по умолчанию в базе данных.. это означает, что его невозможно обновить вручную.

Ответ 3

Вы можете установить StoreGeneratedPattern в Identity, и в этом случае EF считывает значение, возвращаемое из базы данных после выполнения инструкции INSERT. Проблема с этим подходом заключается в том, что при следующем создании XML-сопоставления ваши изменения будут потеряны.

Другой способ сделать это - установить значение самостоятельно в вашем коде DateTime.UtcNow. Вы можете установить это в свой конструктор сущности (при необходимости определите новый конструктор), или вы можете установить его в свой собственный обработчик событий для вашего контекста. Событие SavingChanges (см. Практическое руководство. Выполнение бизнес-логики при сохранении изменений (платформа Entity Framework) для примера обработки события SavingChanges).

Ответ 4

Проблема с настройкой StoreGeneratedPattern = "Computed" или "Identity" заключается в том, что они не позволяют клиенту когда-либо предоставлять значение. Запуск этой проблемы на вставках, а также на обновления.

Кажется, что для StoreGeneratedPattern необходим другой параметр или два, поэтому база данных может хотя бы видеть предоставленные пользователем значения, но при необходимости переопределять их. Это позволит использовать любые существующие триггеры вставки или обновления БД, которые обновляют одно поле на основе другого поля для работы. Например, триггер DB для обновления может обновлять измененную временную метку только в том случае, если она не указана, и только если некоторые поля были обновлены.

Возможно, функция расширенных атрибутов столбца в SQL Server может использоваться для автоматического определения этого поля во время извлечения, поэтому мы не редактируем файлы XML.

Ответ 6

Здесь возможно, но не очень обходное решение -

Настройка Вычисленная в столбце сделайте ее только для чтения, но сделает значение по умолчанию. Возможно иметь реальный вычисленный столбец, например "LastChangedAt_computed", который либо показывает значение "LastChangedAt_default", либо "LastChangedAt_manual".

Теперь вычисленный столбец показывает значение столбца по умолчанию, если столбец вручную не равен-null, и в этом случае он отображается. В модели StoragePattern столбца по умолчанию должен быть "Вычислен".

Это уродливое решение, но оно должно работать.

Ответ 7

Я обнаружил, что довольно просто создать частичный класс для моделей Entity, похожих на то, что вы делаете для Data Annotations. Затем я переопределяю конструктор по умолчанию и задаю свойства по умолчанию в конструкторе. Работает как шарм.

public partial class CallHistoryLog { public CallHistoryLog() { this.NumberFromId = -1L; this.NumberFromName = "NO NAME"; this.NumberToId = -1L; this.NumberToName = "NO NAME"; this.RouteId = -1L; this.Viewed = false; this.Deleted = false; this.DateCreated = DateTime.Now; } }

Ответ 8

Хм... если вы используете EF6, это на самом деле намного проще, чем вы думаете. Просто откройте свою модель, щелкните правой кнопкой мыши на столбце, для которого вы хотите установить значение по умолчанию, выберите свойства, и вы увидите поле "DefaultValue". Просто заполните это и сохраните. Он настроит для вас код.

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

Итак, под капотом пользовательский интерфейс работает, добавляя дополнительное свойство в файл edmx:

<EntityType Name="Thingy">
  <Property Name="Iteration" Type="Int32" Nullable="false" **DefaultValue="1"** />

И добавив необходимый код в конструктор:

public Thingy()
{
  this.Iteration = 1;