Я искал, чтобы регистрировать изменения на объектах в отключенном сценарии.
Исходная проблема: Я вызываю DbContext.Update(Entity)
для обновленной сложной сущности, и, хотя ничего не изменилось, все помечается как Изменено с помощью ChangeTracker и моего параллелизма RowVersion количество столбцов увеличивается.
POST Пользователь без изменений
"userSubPermissions": [],
"fidAdresseNavigation": {
"idAdresse": 1,
"fidPlzOrt": 3,
"strasse": "Gerold Str.",
"hausnr": "45",
"rowVersion": 10,
"isDeleted": 0,
"fidPlzOrtNavigation": {
"idPlzOrt": 3,
"plz": "52062",
"ort": "Aachen",
"rowVersion": 9,
"isDeleted": 0
}
},
"idUser": 35,
"fidAnrede": null,
"fidAdresse": 1,
"fidAspnetuser": "a7ab78be-859f-4735-acd1-f06cd832be7e",
"vorname": "Max",
"nachmname": "Leckermann",
"eMail": "kunde@leasing.de",
"rowVersion": 11,
"isDeleted": 0
POST Возвращенный пользователь
"userSubPermissions": [],
"fidAdresseNavigation": {
"idAdresse": 1,
"fidPlzOrt": 3,
"strasse": "GeroldPenis Str.",
"hausnr": "45",
"rowVersion": 11,
"isDeleted": 0,
"fidPlzOrtNavigation": {
"idPlzOrt": 3,
"plz": "52062",
"ort": "Aachen",
"rowVersion": 10,
"isDeleted": 0
}
},
"idUser": 35,
"fidAnrede": null,
"fidAdresse": 1,
"fidAspnetuser": "a7ab78be-859f-4735-acd1-f06cd832be7e",
"vorname": "Max",
"nachmname": "Leckermann",
"eMail": "kunde@leasing.de",
"rowVersion": 12,
"isDeleted": 0
The RowVersionлогика в DBContext и изменяет версию строки только при изменении состояния объекта.
foreach (var entity in ChangeTracker.Entries().Where(e => e.State == EntityState.Modified))
{
var saveEntity = entity.Entity as ISavingChanges;
saveEntity.OnSavingChanges();
}
Из моего исследования за последние 2 дня, похоже, есть две альтернативы для EF Core,
1.- Как уже упоминалось в этой и многих других подобных публикациях, вы можете использовать TrackGraph https://www.mikesdotnetting.com/article/303/entity-framework-core-trackgraph-for-disconnected-data
Проблема: Это решение помечает всю сущность как измененную при изменении идентификаторасущности присутствует, хотя ничего не изменилось.Я получаю точно такой же результат, как описано выше, RowVersion считает, что мои сущности и все его свойства помечены как измененные.
2.- Как упоминалось в этом посте https://blog.tonysneed.com/2017/10/01/trackable-entities-for-ef-core/ Вы можете загрузить пакет NuGet и реализовать интерфейсы IMergeable и ITrackable на моих объектах.
Проблема: Клиент должен отслеживать изменения в Модели и передавать их в API, чего я хочу избежать, поскольку Angular, похоже, не предлагает для этого хорошего решения.
3.- В книге Программирование Entity Framework есть еще одно решение о том, как EF 6 обрабатывает отключенные сценарии, путем записи исходных значений Глава 4: Запись исходных значений .Когда приходит обновление, контекст считывает объект из БД, а затем сравнивает входящий объект с объектом БД, чтобы увидеть, были ли внесены какие-либо изменения в свойствах, а затем помечает их как измененные.
https://www.oreilly.com/library/view/programming-entity-framework/9781449331825/ch04.html
Проблема: Часть кода, описанного в книге, не может быть реализована в EF Core, например.
((IObjectContextAdapter)this).ObjectContext
.ObjectMaterialized += (sender, args) =>
{
var entity = args.Entity as IObjectWithState;
if (entity != null)
{
entity.State = State.Unchanged;
entity.OriginalValues =
BuildOriginalValues(this.Entry(entity).OriginalValues);
}
};
Должен быть способ реализовать это умное решение обработки изменений в API вместо клиента в сценариях с отключением, в противном случае это может быть очень полезной функцией в EF Core, так как большинство разработчиковиспользуют его для отключенных сценариев.