Да, я нашел другое решение. Если вы используете 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; }
}