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

时间:2016-12-14 17:13:24

标签: c# entity-framework repository-pattern data-annotations

我正在寻找一种方法来自动生成记录,每当我有一个类持久化到数据库,没有触发器或数据库函数。

我的classe Item就是那样的

/// <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类的Item有一个插件来保存它。像那样

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

稍后,我可以去Item__History并查看此课程项目已有的所有州。

我可以通过为Item__History创建一个模型(好的,创建它)并为Item__History创建一个存储库类,并在存储库类中插入/更新Item期间,创建一个Item__History的实例。 ,将所有值复制到此新实例中,并调用Item__Repository将其插入。我不确定它是否是最好的方法,因为我会有很多课程,我想管理历史,并且不想有很多&# 34; XXX ___历史&#34;类和存储库。

对不起,顺便问一下这个问题是不是很好。我希望有人理解。

1 个答案:

答案 0 :(得分: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);