Проблема с расширениями Entity Framework. BulkSaveChanges - Сохранение Guid - PullRequest
0 голосов
/ 16 апреля 2019

Я использую расширение EF для выполнения BulkSaveChanges, и я использую SQLite, все работает отлично, быстрое сохранение и т. Д. У меня проблема в том, что при сохранении Guids, это как если бы BulkSaveChanges было сначала конвертируем Guids в TEXT перед сохранением, но тип данных BLOB, затем при извлечении из базы данных через DbContext идентификаторы GUID не распознаются, моя теория заключается в том, что, поскольку данные преобразуются и тот факт, что тип данных BLOB, EF , не удалось преобразовать его обратно в Guids неявным образом.

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

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

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

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

Сохранено с .SaveChanges:

enter image description here

Сохранено с .BulkSave Изменения:

enter image description here

1 Ответ

1 голос
/ 17 апреля 2019

Мне удалось заставить все работать и жить в этой ситуации, учитывая:

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

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

После анализа ситуации я понял, почему я не могу просто определить тип данных GUID для TEXT?так как BulkSaveChanges делает преобразование в ТЕКСТ в любом случае.Таким образом, EFCore сможет увидеть, что GUID сохраняются как TEXT, а не BLOB, так что он может неявно преобразовать его обратно в 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 до:

enter image description here

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

enter image description here

...