Есть ли простой способ заставить EntityFramework использовать значения по умолчанию SQL?
Например, у большинства моих объектов есть поля DateCreated и DateModified. По умолчанию для них задано значение GetUtcDate() в SQL Server.
Если я попытаюсь создать объект и не устанавливаю эти значения, я получаю исключение, говоря, что он не может запустить SQL-вставку, потому что значение даты вне диапазона. Имеет смысл, поскольку даты С# по умолчанию - 1/1/0001, а минимальная дата SQL Server - 1/1/1753.
Итак, есть ли способ, которым я могу сказать EF либо использовать значения по умолчанию SQL Server, либо НЕ пытаться вставить столбцы, которые не были установлены?
Ответы
Ответ 1
Вы должны установить StoreGeneratedPattern
для этих свойств в Identity
для DateCreated
и Computed
для DataModified
. Он доступен в дизайнере. После этого вы не можете изменять эти значения в своем приложении - только база данных может устанавливать эти свойства. Я писал об этой статье в статье, поскольку эта функция имела ошибку перед VS2010 SP1, но есть сообщения о том, что она по-прежнему не работает.
Ответ 2
Одно из решений заключается в переопределении созданного класса entitycontext с помощью partial. Это перехватит вставки/обновления всех классов сущностей в вашем контексте EF:
public partial class MyEntities : ObjectContext
{
public override int SaveChanges(SaveOptions options)
{
this.DetectChanges();
foreach (var insert in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Added))
{
if (insert.Entity.HasProperty("DateCreated"))
insert.Entity.GetType().GetProperty("DateCreated").SetValue(insert.Entity, DateTime.UtcNow, null);
if (insert.Entity.HasProperty("LastModified"))
insert.Entity.GetType().GetProperty("LastModified").SetValue(insert.Entity, DateTime.UtcNow, null);
}
foreach (var update in this.ObjectStateManager.GetObjectStateEntries(System.Data.EntityState.Modified))
{
if (update.Entity.HasProperty("LastModified"))
update.Entity.GetType().GetProperty("LastModified").SetValue(update.Entity, DateTime.UtcNow, null);
}
return base.SaveChanges(options);
}
}
Или сделать что-то похожее, искать вставки/обновления в полях datestamp и удалять их из коллекции ObjectStateEntries?
Ответ 3
Вы пытались установить значение DefaultValue свойства в объекте?