Проблема с расширениями Entity Framework.BulkSaveChanges — сохранение Guid

#sqlite #.net-core #entity-framework-core #sqlbulkcopy

#sqlite #.net-ядро #entity-framework-core #sqlbulkcopy

Вопрос:

Я использую расширение EF для выполнения BulkSaveChanges , и я использую SQLite, все работает отлично, быстрое сохранение и т. Д. Проблема, с которой я сталкиваюсь, заключается в том, что при сохранении идентификаторов Guid как будто сначала BulkSaveChanges преобразует идентификаторы Guid в ТЕКСТ перед сохранением, но тип данных — BLOB, затем при извлечении из базы данных через DbContext идентификаторы GUID не распознаются, моя теория заключается в том, что, поскольку данные преобразуются, и тот факт, чтотип данных — BLOB, EF, не удалось преобразовать его обратно в Guid неявно.

Более того, при использовании EF .SaveChanges все сохраняется, также поиск идет нормально, но .SaveChanges медленно.

Любая помощь будет принята с благодарностью.

Итак, вот ссылка на расширение: https://entityframework-extensions.net/bulk-savechanges

Вот несколько скриншотов данных, сохраняемых с помощью .SaveChanges против .BulkSaveChanges

Сохранено с помощью .SaveChanges:

введите описание изображения здесь

Сохранено с помощью .BulkSaveChanges:

введите описание изображения здесь

Ответ №1:

Я смог заставить вещи работать и смог смириться с этой ситуацией, учитывая:

  1. Этот SQLite не поддерживает идентификаторы GUID и присваивает тип данных BLOB данным, которые он не может распознать.
  2. Это BulkSaveChanges преобразует или, я должен сказать, исправляет данные до их сохранения, в данном случае преобразует их в ТЕКСТ.

Однако проблема заключается в том, что тип данных остается BLOB, а затем при извлечении через EFCore неявное преобразование обратно в GUID не будет работать.

Проанализировав ситуацию, я понял, почему я не могу просто определить тип данных идентификаторов GUID для TEXT? поскольку BulkSaveChanges в любом случае выполняется преобразование в ТЕКСТ. И таким образом EFCore сможет видеть, что идентификаторы GUID сохраняются как ТЕКСТ, а не как двоичный объект, поэтому он может знать, как неявно преобразовать его обратно в GUID. Оказалось, это возможно!

Вот что я сделал, я добавил эти строки, когда мы строили модель с помощью Fluent API для объектов, содержащих идентификаторы GUID:

 entityTypeBuilder
    .Property(l => l.GUID)
    .HasConversion<string>();
  

Построение модели выглядит примерно так:

 public override void Build(ModelBuilder modelBuilder)
{
    EntityTypeBuilder<Person> entityTypeBuilder =
        modelBuilder.Entity<Person>();

    entityTypeBuilder
        .Property(l => l.GUID)
        .HasConversion<string>();
}
  

Тип данных идентификаторов GUID до:

введите описание изображения здесь

Затем после добавления этих строк:

введите описание изображения здесь