1

我试图比较两个模型,一个是包含要更新的数据的实例,另一个是使用记录的主键从数据库中检索到现有数据的实例。我需要创建另一个模型/Dto 的第三个实例作为列表,并将更新记录的详细信息存储在传入模型中,格式为:更新字段、旧数据、新数据和更新时间。是否可以在不循环数据的情况下做到这一点?

4

1 回答 1

1

是的,我找到了另一种解决方案。如果您使用的是实体框架,您可以使用ChangeTrackerofDbContext来获取最近更改的实体的详细信息。

[HttpPut]
    public List<ChangeLog> UpdateBook(Books input)
    {
        var bookToChange = _context.Books.Find(input.BookId);
        bookToChange.BookName = input.BookName;
        bookToChange.BookPrice = input.BookPrice;
        bookToChange.Author = input.Author;
        _context.Books.Update(bookToChange);
        var changeLog = GetChangeLog();
        return changeLog;
    }

    public List<ChangeLog> GetChangeLog()
    {
        List<ChangeLog> changeLog = new List<ChangeLog>();
        var changedEntities = _context.ChangeTracker.Entries().Where(e => e.State == Microsoft.EntityFrameworkCore.EntityState.Modified).ToList();
        changedEntities.ForEach(change => {
            foreach (var prop in change.OriginalValues.Properties)
            {
                var originalValue = change.OriginalValues[prop].ToString();
                var updatedValue = change.CurrentValues[prop].ToString();
                if (originalValue != updatedValue)
                {
                    var changes = new ChangeLog
                    {
                        Property = prop.Name,
                        oldValue = originalValue,
                        newValue = updatedValue,
                        dateOfChange = DateTime.Now
                    };
                    changeLog.Add(changes);
                }
            }
        });

        return changeLog;
    }

和 Dtos:

public class Books
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int BookId { get; set; }
    public string BookName { get; set; }
    public double BookPrice { get; set; }
    public string Author { get; set; }

}

public class ChangeLog
{
    public string Property { get; set; }
    public string oldValue { get; set; }
    public string newValue { get; set; }
    public DateTime dateOfChange { get; set; }
}
于 2020-01-16T12:39:01.240 回答