Когда пользователь сохраняет изменения в объекте myObject
, я хотел бы зарегистрировать поля, которые были обновлены для этого объекта.
Я могу получить объект с
var myObject = await context.MyObjects.SingleAsync(x => x.Id == id);
И я вижу, что могу получить IEnumerable<PropertyEntry>
с
var changes = context.Entry(myObject).Properties.Where(x => x.IsModified);
Но в моем списке changes
я нигде не вижу имени поля. Кроме того, кажется, что на запрос этого члена в LINQPad уходит 2 полных секунды. Это не кажется правильным.
Как мне заполнить следующее утверждение?
Consolse.Write($"The field {what goes here?} was updated from {change.OriginalValue} to {change.CurrentCalue}.");
Другие вопросы StackOverflow, которые я обнаружил, относятся к предыдущим версиям Entity Framework или переопределяют SaveChanges
и не ищут конкретные объекты.
Обновление! Понял.
public string GetChangeLog<T>(
ApplicationDbContext context,
T entity)
{
var sb = new StringBuilder();
var changes = context.Entry(entity).Properties.Where(x => x.IsModified);
foreach (var change in changes)
{
var propertyBase = (IPropertyBase)change.Metadata;
sb.Append($"\"{propertyBase.Name}\" was changed from \"{change.OriginalValue}\" to \"{change.CurrentValue}\"\n");
}
return sb.ToString();
}