Как использовать стандартную Entity Framework и значения даты по умолчанию - PullRequest
13 голосов
/ 22 октября 2009

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

CONVERT(VARCHAR(10), GETDATE(), 111)

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

Проблема, с которой я столкнулся, заключается в том, что при использовании Entity Framework и отображении поля Date, Entity Framework вставляет значение по умолчанию DateTime.Min при создании экземпляра.

Я не могу сопоставить поле Date с обнуляемым DateTime, т.е. DateTime ?, и при этом я не могу использовать либо CONVERT, либо DateTime.Now.Today в значении по умолчанию в Entity Designer, поскольку оно принимает только жестко закодированные постоянные значения.

Конечно, я могу явно установить поле DateTime в C # всякий раз, когда объект создается, явно в коде, в конструкторе частичного класса или даже во время события сохранения изменений.

Существуют ли другие способы достижения того, чего я хочу, когда вместо этого используется вычисление значений по умолчанию, хранящееся в таблице базы данных?

Ответы [ 8 ]

14 голосов
/ 11 января 2010

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

    public partial class YourDBObject
    {
          public YourDBObject()
          {
               this._DateField = DateTime.Now;
          }
    }
5 голосов
/ 23 октября 2009

Вы можете использовать триггер базы данных , который при вставке проверяет, является ли вставленное значение DateTime.MinValue (01.01.0001), и заменяет его вычисленным желаемым значением. Эта статья MSDN описывает, как создать триггер.

Небольшой "недостаток": с этим решением вам придется сохранить новый объект в базе данных и впоследствии прочитать его, чтобы обновить ваш объект с вычисленным значением.

2 голосов
/ 07 января 2014

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

Все, что нужно сделать команде, это примерно так:

    [Required]
    [DefaultValue] // suggested attribute, whatever you want to call it
    public DateTime Created { get; set; }

Если поле помечено как DefaultValue, то во время генерации SQL в EF свойства с этим атрибутом проверяются, если field == default(DateTime), если так, то просто опустите этот столбец из сгенерированного кода.

1 голос
/ 20 мая 2011

У меня была похожая проблема при использовании RIA Services с Entity Framework. Я не смог установить значение в конструкторе по умолчанию на стороне клиента, потому что классы сущностей, которые там сгенерированы, уже имеют пустой конструктор по умолчанию.

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

1 голос
/ 28 октября 2009

Я только что наткнулся на это - я обошел его, установив дату (поле, которое мне нужно было сгенерировать автоматически) в конструкторе сущности, используя частичный метод. Является ли это идеальным или работает ли он во всех случаях, еще неизвестно, но это уже решило мою проблему.

0 голосов
/ 01 декабря 2017

Только что прошел через эту проблему. Entity Framework сама по себе не поддерживает значения по умолчанию. Вам необходимо установить свойство StoreGeneratedPattern = Computed для столбца в сущности файла Edmx. Значение по умолчанию, которое вы устанавливаете в Базе данных, будет иметь приоритет над тем, что EF устанавливает по умолчанию, т.е. DateTime.Min

0 голосов
/ 09 августа 2013

Я думаю, что ответ, предоставленный lazyberezovsky на другой вопрос SO, является прямым решением этой проблемы Entity Framework и Date Default

0 голосов
/ 24 октября 2009

Поле даты может быть сопоставлено с DateTime? только если столбец обнуляется в базе данных.

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