实体框架扩展问题.BulkSaveChanges-保存指南

时间:2019-04-16 02:01:57

标签: sqlite .net-core entity-framework-core sqlbulkcopy

我正在使用EF扩展来执行BulkSaveChanges,并且正在使用SQLite,一切运行正常,可以快速保存等。我遇到的问题是,在保存Guid时,就好像{{ 1}}是先将Guid转换为TEXT,然后再保存,但数据类型为BLOB,然后通过DbContext从数据库中检索时,GUID无法识别,我的理论是因为数据已转换并且数据类型为事实是BLOB,EF,无法将其隐式转换回Guid。

此外,当使用EF的BulkSaveChanges时,所有内容均被保留,恢复也可以,但是.SaveChanges速度很慢。

任何帮助将不胜感激。

这是扩展名的链接:https://entityframework-extensions.net/bulk-savechanges

以下是使用.SaveChanges与.BulkSaveChanges保存数据的屏幕截图

保存为.SaveChanges:

enter image description here

保存为.BulkSaveChanges:

enter image description here

1 个答案:

答案 0 :(得分:1)

考虑到以下情况,我能够使事情正常运行并能够在这种情况下生存:

  1. 该SQLite不支持GUID,它为无法识别的数据提供BLOB数据类型。
  2. BulkSaveChanges进行了转换,或者我应该说更正,然后再将其保留,在这种情况下,会将其转换为TEXT。

但是问题是数据类型仍然是BLOB,然后通过EFCore检索时,隐式地转换回GUID无效。

分析情况后,我意识到为什么不能仅将GUID的数据类型定义为TEXT?因为BulkSaveChanges仍然会转换为TEXT。这样,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