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

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

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

Ответов (9)

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

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

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

Как использовать Entity Framework по умолчанию и значения даты по умолчанию

Довольно просто создать частичный класс для модели (ей) сущности, аналогично тому, что вы делаете для аннотаций данных. Затем я переопределяю конструктор по умолчанию и устанавливаю свойства по умолчанию в конструкторе. Работает как шарм.

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;
    }
}

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

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

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

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

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

public Thingy()
{
  this.Iteration = 1;

Вставьте тот формат:

    //class
    [Column("guid")]
    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    public string guid_ { get; set; }
    ...
    //end class

после команды yourContext.SaveChanges ();

Вы можете увидеть возвращаемые данные по умолчанию из базы данных в своей модели класса.

Хороший взгляд

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

Вот возможное, но не очень хорошее решение -

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

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

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

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

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

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

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

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