Как получить все сохраненные значения сущностей в DbContext с помощью событий или переопределить SaveChangesAsync () - PullRequest
0 голосов
/ 12 июня 2018

Требуется централизованное решение для получения результирующего Entity как сохраненного в Db, потенциально внутри методов SaveChangesAsync() и SaveChanges() моего DbContext или через прослушиватель событий.

Требуется результатзначение объекта, содержащее все новые .ValueGeneratedOnAdd[Updated/etc]() свойства.т. е. RowVersion, Updated и т. д.

Цель состоит в том, чтобы сообщить до и после Entity для одновременной связи.

Это то, что я имею до сих пор:Этот первый метод вызывает дополнительное ненужное попадание в Db.

public override async Task<int> SaveChangesAsync(
        CancellationToken cancellationToken = new CancellationToken() )
{
    var before = ChangeTracker.Entries().AsEnumerable().First();

    var res = await base.SaveChangesAsync(cancellationToken);

    /* ********************************************************           
       I can do the following, but this results in an extra 
       DbQuery. I know that if this were a  consumer 
       method with entity, after I called SaveChangesAsync() it 
       would have the new resulting values.  Just not sure how 
       to access here inside SaveChangesAsync()?
       ********************************************************** */
    await ChangeTracker.Entries().AsEnumerable().First().ReloadAsync(); 
    /* ********************************************************
       ^ Additionally, ReloadAsync has a "Note, however, that an 
       Added entity may not yet have had its permanent key value 
       created. 
       ********************************************************** */
    var after = ChangeTracker.Entries().AsEnumerable().First();

    return res;
}

Кроме того, я подписался на новые события изменения состояния Tracked и StateChagned, которые упоминаются или связаны на github.Проблема EntityFrameworkCore - Хуки жизненного цикла # 626 : Например:

public class StateListener : IEntityStateListener
{
    public void StateChanging(InternalEntityEntry entry, EntityState newState)
    {
        Console.WriteLine(
            "  Changing {0} from {1} to {2}.",
            entry.Entity.GetType().Name, entry.EntityState, newState);
    }

    public void StateChanged(InternalEntityEntry entry, 
        EntityState oldState, bool fromQuery)
    {
        Console.WriteLine(
            "  Changed {0} to {1} from {2}.",
            entry.Entity.GetType().Name, entry.EntityState, oldState);
    }

    public void StateChanged(InternalEntityEntry entry, EntityState oldState,
        bool skipInitialFixup, bool fromQuery)
    {
        Console.WriteLine(
            "  Changed {0} from {1} to {2}.",
            entry.Entity.GetType().Name, oldState, entry.EntityState);
    }
}

Однако newState и InternalEntityEntry в StateChanged имеют значения, которые следует сохранить, а неновые значения, которые задаются БД, такие как RowVersion, Changed и т. д.

1 Ответ

0 голосов
/ 14 июня 2018

Ответ для тех, у кого похожий поиск - Задав этот вопрос, у меня возникло фундаментальное недоразумение.Я полагал, что сущность, сохраняемая в БД, обновит все свои значения на SaveChanges[Async]().Я верил этому, потому что это поведение первичных ключей, как описано в « Как я могу получить идентификатор вставленной сущности в платформе сущностей? »

Это не относится к свойствам, которые .ValueGeneratedOnAdd[Updated/etc]() и не являются RowVersion или PrimaryKeys.

При таком понимании любое возможное решение, вероятно, потребует запроса к БД.Я подумал добавить такой запрос к OnCommandExecuting, а затем работать с результатом в OnCommandExecuted, но отказался из-за его природы.

...