Как использовать значение столбца по умолчанию из базы данных в Entity Framework? - PullRequest
41 голосов
/ 25 февраля 2009

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

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

Ответы [ 8 ]

9 голосов
/ 29 октября 2010

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

partial void OnCreated()
{
    Guid = Guid.NewGuid();
}
4 голосов
/ 27 мая 2011

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

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

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

4 голосов
/ 24 июня 2009

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

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

4 голосов
/ 23 июня 2009

StoreGeneratedPattern = "Computed" не совпадает со значением по умолчанию, потому что это свойство будет обновляться КАЖДЫЙ РАЗ со значением по умолчанию в базе данных ... это означает, что его невозможно обновить вручную.

1 голос
/ 18 ноября 2012

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

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

0 голосов
/ 08 марта 2017

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

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

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

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

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

public Thingy()
{
  this.Iteration = 1;
0 голосов
/ 28 апреля 2016

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

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;
    }
}
0 голосов
/ 29 июня 2010

Вот возможный, но не очень обходной путь -

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

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

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

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