我正在将一个应用程序转换为 ASP.Net Core,该应用程序要求用户能够在某些情况下离线工作。以前,我们通过将数据复制到 SQLite 数据库并将该数据下载到客户端来处理此问题。我在 ASP.NET Core/Entity Framework 的上下文中遇到了一些问题。
对于上下文,我有一个如下所示的模型:
public class Facility
{
public Guid Id {get; set;}
public string Code {get; set;}
public string Description {get; set;}
}
用于构建 SQLite 数据库的 sql 脚本如下所示:
CREATE TABLE [Facility] (
[Id] uniqueidentifier NOT NULL
, [Code] nvarchar(8) NOT NULL
, [Description] nvarchar(30) NULL
, CONSTRAINT [PK_Facility] PRIMARY KEY ([Id])
);
我正在 Sql 数据库和 SQLite 数据库之间复制数据,如下所示:
var optionsBuilder = new DbContextOptionsBuilder<MyContext>();
optionsBuilder.UseSqlite(MyConnectionString);
using (var sqliteContext = new MyContext(optionsBuilder.Options))
{
await sqliteContext.Fac.AddRangeAsync(CollectionOfFacilityObjects);
await sqliteContext.SaveChangesAsync();
}
除了出现一些问题外,这效果很好GUID
Id 值被插入到 SQLite 数据库中。在 SQLite Studio 中查询 SQLite 数据库会显示值的问题。
我猜这与 SQLite 实际上不支持官方有关GUID
数据类型,正如这里所看到的。 https://www.sqlite.org/datatype3.html因此,值GUID
我的模型类中的 Id 未正确翻译。无论如何我可以得到GUID
正确复制的值?
注意:我解决这个问题的最初方法是为需要复制的每一行生成插入语句,并在一个事务中运行它们。这最初是有效的,但在尝试插入 >10k 记录左右时很快就变得不可行。