Установка значения по умолчанию для свойства DateTime в DateTime.Now внутри System.ComponentModel.

asp.net asp.net-core-2.1 c# ef-core-2.1 entity-framework

Вопрос

Кто-нибудь знает, как я могу указать значение по умолчанию для свойства DateTime, используя атрибут System.ComponentModel DefaultValue?

например я пытаюсь это:

[DefaultValue(typeof(DateTime),DateTime.Now.ToString("yyyy-MM-dd"))]
public DateTime DateCreated { get; set; }

И это ожидает, что значение будет постоянным выражением.

Это в контексте использования с ASP.NET Dynamic Data. Я не хочу создавать эшафот для столбца DateCreated, а просто предоставляю DateTime.Now, если он отсутствует. Я использую Entity Framework в качестве уровня данных

Ура,

Эндрю

Принятый ответ

Вы не можете сделать это с атрибутом, потому что это просто метаинформация, сгенерированная во время компиляции. Просто добавьте код в конструктор, чтобы инициализировать дату, если необходимо, создайте триггер и обработайте пропущенные значения в базе данных или реализуйте метод получения так, чтобы он возвращал DateTime.Now, если вспомогательное поле не инициализировано.

public DateTime DateCreated
{
   get
   {
      return this.dateCreated.HasValue
         ? this.dateCreated.Value
         : DateTime.Now;
   }

   set { this.dateCreated = value; }
}

private DateTime? dateCreated = null;

Популярные ответы

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

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

CreateTable(
    "dbo.SomeTable",
    c => new
        {
            TheDateField = c.DateTime(defaultValueSql: "GETDATE()")
        });

Мне не нравится часто упоминаемое решение его установки в конструкторе класса сущностей, потому что если что-то кроме Entity Framework вставит запись в эту таблицу, поле даты не получит значение по умолчанию. И идея использования триггера для обработки этого случая мне кажется неверной.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow