#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:
Я смог заставить вещи работать и смог смириться с этой ситуацией, учитывая:
- Этот SQLite не поддерживает идентификаторы GUID и присваивает тип данных BLOB данным, которые он не может распознать.
- Это
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 до:
Затем после добавления этих строк: