Как я могу обнаружить изменения свойств в конкретной сущности в Entity Framework Core 2.x? - PullRequest
0 голосов
/ 19 января 2019

Когда пользователь сохраняет изменения в объекте 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();
}

1 Ответ

0 голосов
/ 19 января 2019

Используйте свойство .Metadata для получения IPropertyBase. Это скажет вам, что на самом деле изменилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...