В то время как текущие ответы объясняют, почему вы сталкиваетесь с этой ошибкой, никто не предложил решение или лучшие практики.
Самый правильный ответ здесь заключается в том, что вы должны либо обнулять поля даты в модели, либо указывать значение во всех вставках!
Вам не нужно использовать тип данных DateTime2, это просто дополнительные затраты и не решает проблему. И вы, конечно, не хотите, чтобы сгенерированные сервером значения по умолчанию для любого из этих полей.
Я бы предложил, чтобы CreatedOn был установлен во время вставки, а DeletedOn должен иметь значение null.
Следует отметить, что структура сущности DbContext предоставляет метод SaveChanges (), который можно переопределить в своем классе контекста. Этот метод можно использовать для перехвата сохранений EF и вставки данных, таких как поля аудита. У меня есть базовый класс модели, который содержит все общие данные аудита, такие как CreatedOn, от которых наследуются все мои модели. Затем я могу обновить даты аудита для любой записи в моем контексте следующим образом (используя EF 4.3 DbContext):
public override int SaveChanges()
{
var currentTime = DateTime.UtcNow;
foreach (var entry in ChangeTracker.Entries<Models.Abstract.ModelBase>())
{
// If this is a new entity add to the Db set the CreatedOn field to now
if (entry.State == EntityState.Added)
{
entry.Entity.CreatedOn = currentTime;
}
// Always set the modified by/on
entry.Entity.ModifiedOn = currentTime;
}
return base.SaveChanges();
}