【问题标题】:Problem with Entity Framework extensions .BulkSaveChanges - Saving Guid实体框架扩展的问题 .BulkSaveChanges - 保存指南
【发布时间】:2019-09-06 01:07:52
【问题描述】:

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

另外,当使用EF的.SaveChanges时,一切都被保留了,检索也可以,但是.SaveChanges很慢。

任何帮助将不胜感激。

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

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

使用 .SaveChanges 保存:

使用 .BulkSaveChanges 保存:

【问题讨论】:

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


    【解决方案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的数据类型:

    然后在添加这些行之后:

    【讨论】:

      猜你喜欢
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多