我试图比较两个模型,一个是包含要更新的数据的实例,另一个是使用记录的主键从数据库中检索到现有数据的实例。我需要创建另一个模型/Dto 的第三个实例作为列表,并将更新记录的详细信息存储在传入模型中,格式为:更新字段、旧数据、新数据和更新时间。是否可以在不循环数据的情况下做到这一点?
问问题
1185 次
1 回答
1
是的,我找到了另一种解决方案。如果您使用的是实体框架,您可以使用ChangeTracker
ofDbContext
来获取最近更改的实体的详细信息。
[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 回答