Entity Framework 4.1 (Code First) столбец аудита - PullRequest
0 голосов
/ 21 июня 2011

Я использую Entity Framework 4.1 с подходом Code-First на сайте ASP.NET MVC

Скажем, у меня есть объект с именем Profile , который отслеживает любимую книгу пользователяи я хочу отслеживать, когда пользователь обновляет свою любимую книгу.

ОБНОВЛЕНО :

Используя приведенный ниже класс в качестве примера, я хочу установить для свойства FavoriteBookLastUpdated текущую дату, когда значение свойства FavoriteBook изменяется.

public class Profile
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string FavoriteBook { get; set; }
    public DateTime? FavoriteBookLastUpdated { get; set; }
}

Прямо сейчас я просто обновляю это поле, если необходимо, в действии контроллера Edit перед вызовом метода SaveChanges () DBContext.

Есть ли способ, которым я могу как-то применить эту логику в моей модели?Я бы предпочел не использовать триггеры на стороне базы данных.

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Если вам не нравится ответ @Per Hornshøj-Schierbeck, который я считаю правильным, вы можете попробовать использовать EF для этого:

public override int SaveChanges() 
{
    foreach (var entry in ChangeTracker.Entries<Profile>())
    {
        if (entry.OriginalValues == null || // I'm not sure what value this have if entity is not loaded
            entry.Entity.FavoritBook != entry.OriginalValues["FavoriteBook"].ToString())
        {
            entry.Entity.FavoriteBookLastUpdated = DateTime.Now;
        }
    }

    return base.SaveChanges();
}
2 голосов
/ 21 июня 2011

РЕДАКТИРОВАТЬ: я прочитал ваш комментарий и новый пример:)

Не могли бы вы, чтобы свойство «Любимая книга» было фактическим свойством, которое также устанавливает LastModified? Я не уверен, что EF4 примет это, но тогда вы можете сделать публичное свойство для изменения FavoriteBook и специальное только для EF4. Вам может потребоваться сделать специальное свойство 'InternalsVisibleTo'

http://msdn.microsoft.com/en-us/library/0tke9fxk(v=vs.80).aspx

...