我正在将应用程序转换为ASP.Net Core,要求用户能够在某些情况下脱机工作。以前,我们通过将数据复制到SQLite数据库并将该数据下载到客户端来处理此问题。我在ASP.NET核心/实体框架的上下文中遇到了一些问题。
对于上下文,我有一个看起来像这样的模型:
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
数据类型as seen here.因此,我的模型类中GUID
Id的值未正确转换。无论如何,我可以正确地复制GUID
值吗?
注意:我对此问题的原始方法是为每个需要复制的行生成插入语句,并在一个事务中运行它们。这最初起作用,但在尝试插入&gt; 10k记录时很快变得不可行。
答案 0 :(得分:0)
我认为问题是您正在尝试重复使用相同的DbContext,您应该为Sqlite创建单独的DbContext并为sqlite生成单独的迁移。 每个提供程序生成的迁移代码都不同,当您使用sqlite提供程序生成迁移时,它知道如何处理Guid属性并在其自己的迁移中使用字符串。
您可能已经进行了MSSQL迁移,并且正在尝试使用uniqueidentifier和其他MSSQL特定语法。