持久化时自动创建对象历史记录

Auto create a record for history of object when persist it

我正在寻找一种方法,可以在每次 class 将我拥有的 class 持久保存到数据库时自动生成记录,而无需触发器或数据库函数。

我的 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; }
}

我的 Item 存储库 class 有一个插入来保存它。那样

 /// <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 生成一个记录,它代表了我的项目对象的镜像?每次我更新这个对象项目时,我都需要我的存储库(更新)的方法来生成另一个插入 Item__History,创建另一个对象来反映项目的这个确切时刻。

稍后,我可以去 Item__History 检查这个 class 项目已经拥有的所有状态。

我可以通过为 Item__History 创建模型(好的,它已创建)并创建存储库 class 到 Item__History,并在 insert/update 期间存储库 class 中的项目,我创建了一个 Item__History 的实例,将所有值复制到这个新实例中并调用 Item__Repository 将其插入。我不确定这是否是最好的方法,因为我会有很多 classes 我想管理历史,但不想有很多 "XXX___History" classes 和存储库。

抱歉,顺便说一句,如果问题不够好。希望有人看懂。

如果您使用 IGenericHistoryRepository 接口创建 GenericHistoryRepository class 并实现方法 Add()AddList()Update()Remove()。这样一个通用的 class 你将能够利用它的各种实体。你可以按照这个代码。

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);