EF Core SavechangesInterceptor: обеспечить сохраненные объекты после спасения [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 EF Core SavechangesInterceptor: обеспечить сохраненные объекты после спасения [закрыто]

Сообщение Anonymous »

Я пытаюсь создать SaveChangesInterceptor для уведомления об изменениях таблицы (какие объекты были созданы/обновлены/удалены) после сохранения. Context.changetracker.entries () все помечены как немодифицированный. SavingChanges/SavingChangeSync Использование поля экземпляра, но не безопасно, если происходит несколько спасений? /> Поскольку один экземпляр DBContext не может выполнять несколько сохраняющих сохранений одновременно, я подумал, что могу использовать сам DBContext в качестве «ключа» и комбинировать использование стека, где я бы выдвинул /всплыл бы события (предполагая, что сохранения являются последовательными для одного экземпляра DBContext), но есть ли лучшее решение? Сэкономить одновременно? Если один и тот же перехватчик используется для обоих, я не могу предположить, что сэкономить интенсивные и сохраненные инцессии называются одним и тем же экземпляром DBContext, можно ли?

Код: Выделить всё

internal class WsSaveChangesInterceptor (   IOptionsSnapshot config,
WsService wsService
)
: SaveChangesInterceptor
{
private static readonly ConditionalWeakTable _stateMap = [];

public override ValueTask SavingChangesAsync(DbContextEventData eventData, InterceptionResult result, CancellationToken cancellationToken = default)
{
if (eventData.Context != null)
{
_stateMap.Remove(eventData.Context);
var changesToSend = ListDbChangesForTrackedTables(eventData);
if (changesToSend.Any())
_stateMap.Add(eventData.Context, changesToSend);
}

return base.SavingChangesAsync(eventData, result, cancellationToken);
}

public override int SavedChanges(   SaveChangesCompletedEventData eventData,
int result
)
{
if (eventData.Context != null && _stateMap.TryGetValue(eventData.Context, out var changesToSend))
{
_ = wsService.NotifyOfTablesChangesAsync(changesToSend);    // NOT AWAITED -> normal !
_stateMap.Remove(eventData.Context);
}

return base.SavedChanges(eventData, result);
}

public override void SaveChangesFailed(DbContextErrorEventData eventData)
{
ClearState(eventData);
base.SaveChangesFailed(eventData);
}
}
это код «надежный» ко всем сценариям, в которых можно использовать dbcontext?
Спасибо

Подробнее здесь: https://stackoverflow.com/questions/796 ... after-save
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»