将每个更改的属性记录到数据库中
本文关键字:记录 数据库 属性 | 更新日期: 2023-09-27 18:12:24
考虑在数据库中更新下面的类
public class ProductionLineItem
{
public int Id { get; set; }
public DateTime ProductionDate { get; set; }
public string HandledBy { get; set; }
public DateTime DateToMarket { get; set; }
}
void UpdateProductionRecord(ProductionLineItem existingRecord, ProductionLineItem modifiedRecord)
{
existingRecord.Id = modifiedRecord.Id;
existingRecord.ProductionDate = modifiedRecord.ProductionDate;
existingRecord.HandledBy = modifiedRecord.HandledBy;
existingRecord.DateToMarket = modifiedRecord.DateToMarket;
}
客户希望在专用表中保存所有更改的属性的日志。我应该这样做:
void UpdateProductionRecordWithLog(ProductionLineItem existingRecord, ProductionLineItem modifiedRecord)
{
existingRecord.Id = modifiedRecord.Id;
if (existingRecord.ProductionDate != modifiedRecord.ProductionDate)
{
existingRecord.ProductionDate = modifiedRecord.ProductionDate;
//Log: productionDate update form xyz to abc
}
if (existingRecord.HandledBy != modifiedRecord.HandledBy)
{
existingRecord.HandledBy = modifiedRecord.HandledBy;
//Log: HandledBy updated from Mr. John to Mr. Smith
}
if (existingRecord.DateToMarket != modifiedRecord.DateToMarket)
{
existingRecord.DateToMarket = modifiedRecord.DateToMarket;
//Log: DateToMarket updated form 2013 to 2014
}
}
对于少量的属性,它应该是好的,但如果属性超过15-20。我认为这不是最好的办法。
我可以让我的代码更干净吗?如果需要的话,我愿意使用任何像AutoMapper之类的框架。
对于您的问题有多种优雅的解决方案,其中包括:
- 你可以使用面向方面编程(AOP,对于框架,请参阅这个答案)来捕获对属性的每一个修改。您可以保存这些更改以供以后检索或调用事件,然后记录这些事件。
- 你可以把反射(例如PropertyInfo)在这里很好地使用,遍历所有属性并比较当前值。这将使您不必手工编写所有属性。
- 反射和属性与需要记录的属性一起也可以工作。使用属性作为一种便利贴,记录那些重要的属性。
请注意,反射可能会带来一些性能损失。
你使用实体框架吗?它支持INotifypropertychanged,可以使用:
如何在属性更改时引发事件?
如果没有,您的类可以自己实现INotifyPropertyChanged() -虽然不是很好(您必须显式地编写geteers/setter),但它提供了比直接在属性中调用登录工具更好的解耦(如果,如果您的日志不可用)。
我可能会担心性能问题,所以我可能会存储日志,并且只在一段时间内写入一次…
首先,您已经完成了比要求更多的工作,因为您只更改现有项目的属性,如果它们是不同的。
在你的类中添加一些新方法,例如LogDifferences(ProductLineItem old, ProductLineItem new)
,并从UpdateProductionItem
调用它会很好。
。只是记录旧记录新记录,就像数据库事务日志一样。在需要的时候,对哪些地方发生了变化进行分析。
最后一种可能,不可否认可能会导致比它解决的问题更多的问题,是将属性的值存储在一个Dictionary<String,dynamic>
中而不是离散成员中。
那么基于Existing["ChangedToMarket"] = Modified["ChangedToMarket"]
记录更改是相当琐碎的。