实体框架扩展的问题.BulkSaveChanges - 保存Guid

问题描述 投票:0回答:1

我正在使用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

使用.BulkSaveChanges保存:

enter image description here

sqlite .net-core entity-framework-core sqlbulkcopy
1个回答
1
投票

考虑到:我能够让事情变得有效并能够适应这种情况:

  1. SQLite不支持GUID,它将BLOB数据类型提供给无法识别的数据。
  2. 那个BulkSaveChanges转换或者我应该说在数据持久之前纠正数据,在这种情况下将其转换为TEXT。

但问题是数据类型仍然是BLOB,然后当通过EFCore检索时,隐式转换回GUID将不起作用。

在分析了这种情况后,我意识到为什么我不能只为GUXT定义GUID的数据类型?因为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

© www.soinside.com 2019 - 2024. All rights reserved.