Сравните две модели в ASP. Net Core, чтобы обнаружить изменения без петли - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь сравнить две модели: одна - это экземпляр, который содержит данные для обновления, а другая - это экземпляр, в котором существующие данные извлекаются из базы данных с использованием первичного ключа записи. Мне нужно создать третий экземпляр другой модели / Dto в виде списка и сохранить сведения об обновленных записях во входящей модели в формате: обновленное поле, старые данные, новые данные и время обновления. возможно ли сделать это без перебора данных?

1 Ответ

0 голосов
/ 16 января 2020

Да, я нашел другое решение. Если вы используете Entity Framework, вы можете использовать ChangeTracker из DbContext, чтобы получить подробную информацию о сущностях, которые были недавно изменены.

[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; }
}
...