Entity Framework: установка отметки времени обновления - PullRequest
10 голосов
/ 20 января 2010

Все наши таблицы базы данных имеют UpdateUserID и UpdateTS. Я хотел бы иметь этот набор, если моя сущность имеет изменения. Есть ли способ получить это обновление на месте условно?

Если я вручную установлю UpdateTS в коде, то он скажет, что моя сущность изменилась и всегда будет обновлять объект.

Ответы [ 3 ]

7 голосов
/ 20 января 2010

Я вызываю этот метод расширения перед вызовом context.SaveChanges():

public static void SetLastModified(this ObjectContext context, DateTime dateTime)
{
    DateTime now = DateTime.UtcNow;
    foreach (ObjectStateEntry entry in context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified))
    {
        if (!entry.IsRelationship)
        {
            IHasLastModified lastModified = entry.Entity as IHasLastModified;
            if (lastModified != null)
                lastModified.LastModified = now;
        }
    }
}

Я могу легко вызвать этот код, потому что я обернул ObjectContext в класс репозитория.Если вы используете его голым, вы можете подключить событие ObjectContext.SavingChanges, чтобы сделать нечто подобное.

6 голосов
/ 29 октября 2012

Вот реализация двух других идей, со следующими соображениями

  • Перед вызовом SaveChanges () убедитесь, что вы либо создаете прокси-серверы, которые автоматически обнаруживают изменения, либо обнаружили изменения вручную. В противном случае состояние объекта будет EntityState.Unmodified, а последняя измененная отметка времени не будет обновлена.
  • Я расширил код, чтобы также установить последнюю модифицированную метку времени при первом создании объекта (EntityState.Added)

Код

public interface IHasLastModified
{
    DateTime? LastModified { get; set; }
}

public class MyClass : IHasLastModified
{
    public virtual int Id { get; set; }

    public virtual string SomeOtherProperty { get; set; }

    public virtual DateTime? LastModified { get; set; }
}

public class MyContext : DbContext
{
    public override int SaveChanges()
    {            
        DateTime now = DateTime.UtcNow;
        foreach (ObjectStateEntry entry in (this as IObjectContextAdapter).ObjectContext.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified))
        {
            if (!entry.IsRelationship)
            {
                IHasLastModified lastModified = entry.Entity as IHasLastModified;
                if (lastModified != null)
                    lastModified.LastModified = now;
            }
        }

        return base.SaveChanges();
    }
3 голосов
/ 20 января 2010

Вы должны иметь возможность обрабатывать событие SavingChanges ( пример здесь ) и выполнять логику, как описано @sander

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...