2

Я ищу подход к автоматической генерации записи каждый раз, когда класс, который у меня есть, сохраняется в базе данных, без триггеров или функций базы данных.Автоматическое создание записи для истории объекта при его сохранении

Мой Classe Деталь что-то подобное

/// <summary> 
/// Modelo de representação do Item (Produto) 
/// </summary> 
[Table("Item")] 
public class Item : History 
{ 
    /// <summary> 
    /// Id único gerador pelo sistema 
    /// </summary> 
    [Key] 
    public long Id { get; set; } 

    /// <summary> 
    /// Nome do produto 
    /// </summary> 
    public string Name { get; set; } 

    /// <summary> 
    /// Código de barras 
    /// </summary> 
    public string BarCode { get; set; } 

    /// <summary> 
    /// Código da imagem do produto na base de dados 
    /// </summary> 
    public long Image_Id { get; set; } 
} 

Мой репозиторий класс Предмет имеет вставку упорствовать его. Как что

/// <summary> 
/// Repositório do objeto Item 
/// </summary> 
public class ItemRepository : BaseRepository<Item> 
{ 
    #region Constructors 
    /// <summary> 
    /// Inicializa o repositório de Item 
    /// </summary> 
    /// <param name="context">Contexto usado em sua inicialização</param> 
    public ItemRepository(DbContext context) : base(context) 
    { 

    } 
    #endregion 

    #region Methods 

    public override void Insert(Item entity) 
    { 
     base.Insert(entity); 
    } 

    #endregion 
} 

Мой вопрос: Как я могу генерировать запись в моей objetc Item__History, который представляет собой зеркало для моего объекта элемента в этой Momento? Каждый раз, когда я обновляю этот объект objetct, мне нужен метод моего репозитория (update), чтобы сгенерировать еще одну вставку в Item__History, создав другой объект, который отражает этот точный момент Item.

Позже, я могу пойти Item__History и проверить все состояния этого класса. Item уже есть.

Я могу сделать это, создав модель для Item__History (нормально, она создана) и создала класс репозитория для Item__History, а во время вставки/обновления элемента внутри класса репозитория я создаю экземпляр Item__History, скопирую все значения в этот новый экземпляр и вызвать Item__Repository для его вставки. Я не уверен, что это лучший подход, так как у меня будет много классов, которые я хочу управлять историей, и не хочу иметь много классов и репозиториев «XXX___History».

Извините, кстати, если вопрос не подходит. Надеюсь, кто-то это поймет.

ответ

3

Что если вы создаете GenericHistoryRepository класс с IGenericHistoryRepository интерфейсом и реализации методов Add(), AddList(), Update() и Remove(). Такой общий класс вы сможете использовать в своих возможностях различные сущности. Вы можете следовать этому коду.

namespace DataAccessLayer.DataAccessObject 
{ 
    public interface IGenericHistoryRepository<T> where T : class 
    { 

     void Add(params T[] items); 
     void AddList(params T[] items); 
     void Update(params T[] items); 
     void Remove(params T[] items); 

    } 
    public class GenericHistoryRepository<T> : IGenericHistoryRepository<T> where T : class 
    { 

     public virtual void Add(params T[] items) 
     { 
      using (var context = new MainContext()) 
      { 
       foreach (T item in items) 
       { 
        context.Entry(item).State = EntityState.Added; 
       } 
       context.SaveChanges(); 
      } 
     } 
     public void AddList(params T[] items) 
     { 
      using (var context = new MainContext()) 
      { 
       foreach (T item in items) 
       { 
        context.Entry(item).State = EntityState.Added; 
       } 
       context.SaveChanges(); 
      } 
     } 
     public virtual void Update(params T[] items) 
     { 
      using (var context = new MainContext()) 
      { 
       foreach (T item in items) 
       { 
        context.Entry(item).State = EntityState.Modified; 
       } 

       context.SaveChanges(); 

      } 
     } 
     public virtual void Remove(params T[] items) 
     { 
      using (var context = new MainContext()) 
      { 
       foreach (T item in items) 
       { 
        context.Entry(item).State = EntityState.Deleted; 
       } 
       context.SaveChanges(); 
      } 
     } 

    } 

} 

Использование

public override void Insert(Item entity) 
    { 
     base.Insert(entity); 
     new GenericHistoryRepository<Item_History>().Add(entity); 
    } 
    ... 

    new GenericHistoryRepository<XXX_History>().Add(entity); 
+0

Выглядит хорошо, но сущность на втором примере кода вы добавите, это предмет. Когда вы вызываете новый GenericHistoryRepository (). Add (entity), вы отправляете Item вместо Item__History. У них небольшая разница между обоими (возможно, я делаю это неправильно). Класс __History имеет XXXX_Id (например, Item_Id), который ссылается на идентификатор свойства Item (чтобы узнать, для какого элемента находится эта история). Правильно ли я спрашиваю? –

+0

Используете ли вы единую систему как историю для всех других лиц? _ «У меня будет много классов, которые я хочу управлять историей, и не хочу иметь много классов и репозиториев« XXX___History ».« Я имею в виду, что у каждого из них XXX есть XXX_History. В этом случае общий репозиторий истории - хороший ход в более раннем случае. Вам нужно создать собственную логику, где вы проверяете, какой именно идентификатор этого элемента. Но эта логика не должна быть интегрирована с репозиториями. Может быть добавлен в бизнес-логику –

+0

Также в методе вставки вы можете создать новую Item_history и отправить вместо нее сущность. Но я не знаю, хорошая идея добавить эту логику в репозитории. –