Внедрение изменений в данные модели - PullRequest
1 голос
/ 04 сентября 2010

У меня есть некоторые объекты, которые имеют элементы контрольного журнала, такие как LastUpdated и LastUpdatedBy. Я пытаюсь определить наиболее подходящий способ обновления этих полей до текущей даты, времени и текущего пользователя при изменении модели.

Простейшей реализацией было бы повлиять на это изменение в моем контроллере до того, как я обновлю objectcontext, но это привело бы к большому количеству повторяющегося кода. Я мог бы немного реорганизовать это и, возможно, создать вспомогательный метод, который я мог бы вызывать и передавать модель, тем самым сводя вещи к одной строке кода в моем контроллере, но я, честно говоря, предпочел бы, чтобы это было автоматически, что-то, что код контроллера не должен волновать о.

Кто-нибудь подходил к этой проблеме раньше? Каково было ваше решение? Что вы предлагаете?

(ps mvc и ef noob, так что может быть опция типа фреймворка мне не хватает)

Ответы [ 2 ]

2 голосов
/ 04 сентября 2010

Я следовал аналогичному шаблону, как @Nix, только я не использовал T4, так как я предпочитаю разработку кода сначала вместо дизайнера.Если у вас есть Context с именем MyDbContext, вы можете частично его классифицировать, чтобы переопределить метод SaveChanges().У меня также есть класс IAuditable, с которого расширяются все мои необходимые объекты.

public interface IAuditable
{
    User CreatedBy { get; set; }
    DateTime? DateCreated { get; set; }
    User ModifiedBy { get; set; }
    DateTime? DateModified { get; set; }
    User DeletedBy { get; set; }
    DateTime? DateDeleted { get; set; }
}

// Classes that implement the IAuditable here.

public class User : EntityObject
{
    public string Username { get; set; }
    public string DisplayName { get; set; }
    // etc...
}

partial class MyDbModel
{
    public override int SaveChanges(SaveOptions options)
    {

        // Search all added, modified or deleted entities.
        var entries = this.ObjectStateManager.GetObjectStateEntries(EntityState.Added | EntityState.Modified | EntityState.Deleted);

        foreach (var entry in entries)
        {

            var auditable = entry.Entity as IAuditable;

            if (auditable != null)
            {
                if (entry.State == EntityState.Added)
                {
                    auditable.CreatedBy = null; // TODO - Get current user.
                    auditable.DateCreated = DateTime.Now;
                    auditable.ModifiedBy = null; // TODO - Same as CreatedBy?
                    auditable.DateModified = DateTime.Now;
                }
                else if (entry.State == EntityState.Modified)
                {
                    auditable.ModifiedBy = null; // TODO - Get current user.
                    auditable.DateModified = DateTime.Now;
                }
                else if (entry.State == EntityState.Deleted)
                {
                    auditable.DeletedBy = null; // TODO - Get current user.
                    auditable.DateDeleted = DateTime.Now;
                }
            }
        }


        return base.SaveChanges(options);
    }
}
0 голосов
/ 04 сентября 2010

Я сделал такие вещи, я использовал шаблоны T4. См .: Entity Framework Trigger, как аудит

По сути, я просто заставил все объекты расширять интерфейс, а затем в SaveChanges перебрать все, что «IAuditable», и установить даты обновления / вставки.

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

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