持久化时自动创建对象历史记录
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);
我正在寻找一种方法,可以在每次 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);