Я хочу проверить, когда определенная сущность изменена / обновлена / вставлена / удалена в Entity Framework (с базой данных). (например, Таблица сущностей ProductType)
** Хотелось бы, чтобы Change Tracker был сохранен и опрошен позже, так как «изменения дорожки теряются, если они не сохраняются до уничтожения объекта DbContext». Для анализа требуется только то, чтобы ChangeTracker оставался в течение пары часов, а при необходимости сохранялся в MessageQueue. MemoryCache также может работать.
1) Кто-то рекомендует использовать LoggerFactory:
optionsBuilder.UseLoggerFactory(loggerFactory)
https://www.entityframeworktutorial.net/efcore/logging-in-entityframework-core.aspx
Однако может быть трудно разобрать как обновления, модификации, удаленияможет быть сделано с помощью Join, псевдонимов, скобок, с помощью сложных операторов SQL, часто генерируемых EF. Таким образом, синтаксический анализ текста может быть неточным.
INSERT INTO [Students] ([DateOfBirth], [GradeId], [Height], [Photo], [Stud
entName], [Weight])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5);
SELECT [StudentID]
FROM [Students]
WHERE @@ROWCOUNT = 1 AND [StudentID] = scope_identity();
info: Microsoft.EntityFrameworkCore.Database.Command[200101]
Executed DbCommand (68ms) [Parameters=[@p0='' (DbType = DateTime2), @p1=''
(DbType = Int32), @p2='0', @p3='' (Size = 8000) (DbType = Binary), @p4='Steve'
(Size = 4000), @p5='0'], CommandType='Text', CommandTimeout='30']
SET NOCOUNT ON;
INSERT INTO [Students] ([DateOfBirth], [GradeId], [Height], [Photo], [Stud
entName], [Weight])
VALUES (@p0, @p1, @p2, @p3, @p4, @p5);
SELECT [StudentID]
FROM [Students]
WHERE @@ROWCOUNT = 1 AND [StudentID] = scope_identity();
A data reader was disposed.
dbug: Microsoft.EntityFrameworkCore.Database.Transaction[2002
2) Вариант 2 - ChangeTracker, другие рекомендовали использовать ChangeTracker перед оператором SaveChanges
, поскольку он намного чище (см. Запрос ниже). Однако выполнение этого перед каждым оператором SaveChanges, учитывая, что у нас 500 транзакций в секунду, влияет на скорость работы приложения.
Таким образом, существует ли какой-либо способ для потоковой передачи и сохранения истории ChangeTracker в журнал после сохранения изменений, где можно упростить запроскакие объекты изменились? Оптимально это выяснить после завершения транзакции, без блокировки транзакций.
var Entries = context.ChangeTracker
.Entries()
.Where(x => x.State == EntityState.Modified || x.State == EntityState.Deleted|| x.State == EntityState.Added)
.Select(x =>x.Entity)
.ToList();
https://entityframework.net/change-tracker