ASP.Net Core将数据从SQL数据库复制到SQLite

时间:2018-04-20 14:09:21

标签: c# sql-server entity-framework sqlite asp.net-core

我正在将应用程序转换为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数据库会显示值的问题。

bad GUID values

我猜这与SQLite没有实际支持官方GUID数据类型as seen here.因此,我的模型类中GUID Id的值未正确转换。无论如何,我可以正确地复制GUID值吗?

注意:我对此问题的原始方法是为每个需要复制的行生成插入语句,并在一个事务中运行它们。这最初起作用,但在尝试插入&gt; 10k记录时很快变得不可行。

1 个答案:

答案 0 :(得分:0)

我认为问题是您正在尝试重复使用相同的DbContext,您应该为Sqlite创建单独的DbContext并为sqlite生成单独的迁移。 每个提供程序生成的迁移代码都不同,当您使用sqlite提供程序生成迁移时,它知道如何处理Guid属性并在其自己的迁移中使用字符串。

您可能已经进行了MSSQL迁移,并且正在尝试使用uniqueidentifier和其他MSSQL特定语法。