自动创建对象的历史记录时,坚持它
问题描述:
我正在寻找一种方法来自动生成一个记录每次我有一个类是坚持数据库,没有触发器或数据库函数。自动创建对象的历史记录时,坚持它
我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表示镜子在这个时代报我的项目目标?每次我更新这个Objetct Item时,我都需要我的存储库(更新)的方法在Item__History中生成另一个插入,创建另一个反映Item的确切时刻的对象。
后来,我可以去Item__History并检查这个类Item已经有的所有状态。
我可以通过为Item__History(确定它创建)创建一个模型并为Item__History创建一个存储库类,并在存储库类的Item的插入/更新过程中创建Item__History的一个实例,将所有将这些值加入到这个新实例中,并调用Item__Repository将其插入。我不确定这是否是最好的方法,因为我会有很多我想要管理历史的类,并且不想拥有很多“XXX_History”类和存储库。
对不起,btw如果问题不够好。我希望有人能理解它。
答
怎么样,如果你创建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);
看起来不错,但在您发布第二个代码示例的实体,是一个项目。当您调用新的GenericHistoryRepository()。添加(实体)时,您发送一个Item而不是Item__History模型。他们之间有一点区别(也许我做错了)。 __History类有一个XXXX_Id(如Item_Id),它引用Item的属性Id(知道这个历史记录用于哪个项目)。我是对的吗? –
您是否使用单个实体作为所有其他实体的历史记录? _“我将有很多课程要管理历史,并且不希望有很多”XXX_History“课程和资料库。”_我的意思是每个实体XXX都有XXX_History。在这种情况下,通用历史信息库在先前的情况下是很好的举动。您需要创建自己的逻辑,以便在其中检查项目的确切ID。但是这种逻辑不应该与存储库集成。可以添加到业务逻辑 –
另外在插入方法中,您可以创建新的Item_history并发送实体。但是我不知道将这个逻辑添加到存储库是否好主意。 –