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

EntityFramework не обновляет столбец со значением по умолчанию

Я вставляю объект в db SQL Server через EntityFramework 4 (EF). В таблице приема находится столбец (CreatedDate), значение по умолчанию которого установлено на getdate(). Поэтому я не предоставляю его EF, полагая, что его значение будет дефолтом SQL Server до getdate().

Однако этого не происходит; вместо этого EF возвращает ошибку проверки n SaveChanges().

Есть ли причина, по которой вы знаете это? Пожалуйста, дайте мне знать.

Большое спасибо.

4b9b3361

Ответ 1

Если вы никогда не хотите редактировать это значение (например, с созданной датой), вы можете использовать:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public virtual DateTime CreatedDate { get; set; }

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

Обратите внимание, что вы не можете изменить это значение, поэтому это не решение, если вы просто хотите получить начальное значение.

Если вам просто нужно значение по умолчанию, но по-прежнему разрешено его редактировать, или вы используете Entity Framework 5 и ниже, вы должны установить значение по умолчанию в коде.

Подробнее об этом здесь:

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

Ответ 2

Просто примените атрибут [DatabaseGenerated(DatabaseGeneratedOption.Identity)] к полю столбца в определении объекта объекта.

Например:

public class SomeTable
{
    ...

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public DateTime CreatedDate { get; set; }

    ...
}

Это сообщает Entity Framework, что начальное значение столбца предоставляется базой данных. Значение будет автоматически обновляться из базы данных после вставки строки.

Ответ 3

Правильный ответ на этот вопрос - сообщить Entity Framework, что столбец вычислен.

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public virtual DateTime CreatedDate { get; set; }

DatabaseGeneratedOption.Computed означает, что он задается базой данных и не может быть изменен с помощью Entity Framework. DatabaseGeneratedOption.Identity означает, что столбец является столбцом IDENTITY, который должен использоваться только для автоматического ввода числовых первичных ключей.

** Обратите внимание, что документация для перечисления DatabaseGeneratedOption не упоминает ничего о столбцах IDENTITY (отчасти потому, что это специфическая имплиментация SqlServer подробно). Вместо этого он определяет параметр "Идентификация" как "База данных генерирует значение при вставке строки". Я действительно искал способ установить ModDate с помощью ограничения DEFAULT при создании записи, но чтобы он мог быть изменен из Entity Framework при обновлении записи. Поэтому из-за описания я подумал, что нашел решение, но пытаюсь изменить ModDate записи, когда он был помечен DatabaseGeneratedOption.Identity, выбрасывал исключение. Так не везет там.

Ответ 4

попробуйте использовать это.

public virtual DateTime CreatedDate { get; set; } = new Datetime();

Ответ 5

Чтобы работать, я объявила новую переменную и установила эту переменную в текущее время. Затем при вставке данных я ссылался на переменную на столбец:

var db = new YourTableEntities();
var dateNow = DateTime.Now; 

db.YourTableEntities.Add(new YourTableEntities()
{
    ColumnAInTable = someAVariable,
    ColumnBInTable = someBVariable,
    ColumnThatShouldDefaultToGetDate = dateNow
});

Надеюсь, это поможет!