【问题标题】: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】:
考虑到:
- SQLite 不支持 GUID,它为无法识别的数据提供 BLOB 数据类型。
-
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的数据类型:
然后在添加这些行之后: