Есть ли простой способ заставить 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 свойства в объекте?