Отключенные сущности в EF Core - PullRequest
2 голосов
/ 25 апреля 2019

Я искал, чтобы регистрировать изменения на объектах в отключенном сценарии.

Исходная проблема: Я вызываю 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, так как большинство разработчиковиспользуют его для отключенных сценариев.

...