新建SqliteDll
-
创建Dll文件,安装对应Nuget包System.Data.SQLite.EF6.Migrations(其他依赖项会自动下载)
-
修改App.config文件,将Provider中的System.Data.SQLite.EF6复制一行,改为System.Data.SQLite,如图:
-
创建Entity模型,主键前加上[Key]标识(需注意SqliteCodeFirst中Guid类型是作为二进制存储的,如果默认使用Guid在使用linq时将无法正确查询到。我所知道的办法是在Sqlite使用TEXT类型存储,所以这里Guid使用String类型替代)
-
创建类SqliteDbContext继承DbContext,属性包括Entity模型,如图
这里的使用的"Sqlite"先不要着急,等会在主项目中配置他的链接 -
打开工具->Nugget包管理器->程序包管理器控制台,执行Enable-Migrations(需要把默认项目改为SqliteDll,不然每次执行命令都要加上 -project指向SqliteDll,例:Enable-Migrations -project SqliteDll)
-
若上一步成功,会自动生成Migrations文件夹,且文件夹下存在文件Configuration.cs。打开Configuration.cs,在构造函数中添加如下代码引入SqliteMigration
-
复制下图代码在文件Configuration.cs下,如图
public class CheckAndMigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>
: MigrateDatabaseToLatestVersion<TContext, TMigrationsConfiguration>
where TContext : DbContext
where TMigrationsConfiguration : DbMigrationsConfiguration<TContext>, new()
{
public CheckAndMigrateDatabaseToLatestVersion(bool useSuppliedContext) : base(useSuppliedContext)
{
}
public override void InitializeDatabase(TContext context)
{
var migratorBase = ((MigratorBase)new DbMigrator(Activator.CreateInstance<TMigrationsConfiguration>()));
if (migratorBase.GetPendingMigrations().Any())
migratorBase.Update();
}
}
- 回到SqliteDbContext.cs文件,添加如下代码使用该配置
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer(new CheckAndMigrateDatabaseToLatestVersion<SqliteDbContext,Configuration>(true));
}
- 程序包管理器控制台命令输入Add-Migration [名称] ,名称用来做版本管理,以后会用到。第一次可以取名叫InitDatabase什么的。
以上Dll基本完成了
主体项目
-
同样先安装Nuget,并配置App.config复制一行改为System.Data.SQLite(不确定是否必要,但entiytyFramework是必须要装的,有兴趣可以自己试试哪些是不必要的^ ^)
-
在App.config中添加connectionStrings
<connectionStrings>
<add name="Sqlite" connectionString="Data Source=D:\Sqlite.db" providerName="System.Data.SQLite.EF6"/>
</connectionStrings>
- 添加写好的DLL引用就可以使用啦
需要注意
sqlite只能新增列、修改表名、删除表,它不支持修改列名及类型、不支持删除列。因此如果需要晚上这些功能,需要在修改模型的基础上执行Add-Magration,然后删除自动生成的代码,使用sql语句完成“生成新表,导入数据,删除原表,重命名新表”的功能,例如
public override void Up()
{
SqliteDbContext dbc = new SqliteDbContext();
string script = @"PRAGMA foreign_keys = 0;
CREATE TABLE sqlitestudio_temp_table AS SELECT * FROM Animals;
DROP TABLE Animals;
CREATE TABLE Animals (
Id NVARCHAR (128) NOT NULL,
Name STRING NOT NULL,
PRIMARY KEY (
Id
)
);
INSERT INTO Animals (
Id
)
SELECT Id
FROM sqlitestudio_temp_table;
DROP TABLE sqlitestudio_temp_table;
PRAGMA foreign_keys = 1;";
dbc.Database.ExecuteSqlCommand(script);
}
这些SQL语句可以借用工具SQLiteStudio生成,只需要复制一份数据库,在数据库中做修改,保存前会自动生成SQL语句。同样的再Down方法中把改回来的SQL写上。
以上是我自己摸索的使用方式,如果有错误请指出,谢谢!