将每个更改的属性记录到数据库中

本文关键字:记录 数据库 属性 | 更新日期: 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"]记录更改是相当琐碎的。