Создание таблицы истории с использованием Entity Framework 4.1 - PullRequest
1 голос
/ 10 ноября 2011

Я работаю над приложением asp.net MVC 3 и использую подход codeFirst. Я пытаюсь создать таблицу истории или таблицу пользователей, где я хочу отслеживать, какие столбцы были изменены пользователем. Как я могу сделать это с помощью EF Code First.

Нужно ли делать это после DataContext.savechanges?

Пожалуйста, предложите.

Спасибо.

Ответы [ 3 ]

1 голос
/ 10 ноября 2011

DbContext имеет метод с именем Entry<T>:

var entity = context.Items.Find(id);
entity.Name = "foobar";

var entry = context.Entry<Item>(entity);
Запись

будет иметь тип DbEntityEntry<T> и имеет свойства OriginalValues и CurrentValues.

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

Либо так, либо используйте триггеры базы данных.

0 голосов
/ 19 мая 2016

Похоже, вы хотите фильтр, который наследуется от ActionFilterAttribute. В моем случае это самый простой пример, который у меня есть. Это моя модель, обратите внимание, что атрибуты определяют отображение в базе данных.

[Table("UserProfile")]
public class UserProfile
{
    [Key, DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }

    public string UserName { get; set; }
}

В моем случае это было так просто, как показано ниже, хотя это не было историческим:

public sealed class UsersContext : DbContext
{
    public UsersContext() : base("DefaultConnection")
    {
    }

    public DbSet<UserProfile> UserProfiles { get; set; }
}

public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        LazyInitializer.EnsureInitialized(ref _initializer, ref isInitialized, ref initializerLock);
    }

        public void CheckDatabase()
        {
            Database.SetInitializer<YourDBContextType>(null);

            using (var context = new YourDBContextType())
            {
                if (!context.Database.Exists())
                {
                        ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                }
            }

// Uses your connection string to build the following table. 
 WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
        }

Конечным результатом является не только то, что EF является первым кодом, но также позволяет вашим моделям использовать ваши примитивы, полученные из ваших сложных объектов. Теперь, если у вас есть другой, скажем, исторический, DBContext, я бы порекомендовал изменить либо текстовый файл преобразования, либо создать базовый класс для ваших сущностей. Оба способа позволяют легко генерировать код, который может быть вставлен в вашу таблицу, а затем обработать эту сущность, клонировать ее в историческую модель и сохранить. При всем при этом я являюсь поклонником первых подходов к базе данных, концентрируясь на ограничениях, триггерах и т. Д. Вместо фреймворка.

0 голосов
/ 10 ноября 2011

Я не уверен, действительно ли это «подходящий» способ сделать это, но это обычно делается в sql:

  1. Создать дополнительное свойство version типа intили что-то в этом роде.
  2. Поскольку вы, вероятно, не хотите выполнять цикл каждый раз, добавьте другое свойство IsLatestVersion типа bool
  3. Когда объект сохраняется, проверьте, существует ли объект уже.Если это так, установите для объекта значение IsLatestVersion = false.
  4. Увеличьте значение version и сохраните изменения как новый объект.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...