Требуется централизованное решение для получения результирующего 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
и т. д.