.NET 5学习笔记(10)——Entity Framework Core之切换SQLServer和SQLite

2021-02-08

上一篇我们梳理了CodeFist的一般流程,本篇我们讨论如何在一套代码中,支持SQL Server和SQLite的切换。同时从本篇开始,我们从.NET Core 3.1 迁移到.NET 5。
相信.NET 到了5这个版本,所有人都不会再怀疑某软跨平台的决心。而且SQL Server也从2017版本开始支持Linux。但是我相信在Linux上使用Visual Stuido Code时,搭配SQLite更能体现某软现任CEO崽卖爷田不心疼的精神。
SQLite是非常常见的数据库,最大的特点就是零部署,以文件的形式存在与Application中,极大地方便了客户端软件的安装。那么我们在做一些小型项目时,为了方便部署。就选择将免费的SQL Server Express替换成不要钱的SQLite。后者的作者在前些年宣布将SQLite贡献给全人类,放弃一切权力,非常的伟大,我表示由衷的钦佩。
首先我们按照上一篇《.NET Core学习笔记(9)——Entity Framework Core之Code First》搭建如下结构的工程,以实现对SQL Server的访问。

和上一篇稍有不同的是,我将之前DataAccess工程加了后缀SQLServer,同时建立了一个新的空Library叫DataAccess.SQLite。
为了能够支持SQLite,我们需要通过NuGet给DataAccess.SQLite工程添加EntityFrameworkCore.Sqlite和EntityFramework.Tools两个引用。

值得一提的是,这里EntityFrameworkCore的引用版本从之前的3.1.x升级到了5.0.2。这是因为从本篇开始,示例工程将全部升级到.NET 5版本。也就是说,再也不用区别作为启动项的.NET Core 3.1工程,和作为Library的.NET Standard 2.0了。某软最终创造了“生命的大和谐”(该词解释权归梁羽生先生所有)。

话说我们到现在还没有创建SQLite数据库文件……我一般是去下载DB Browser for SQLite 来创建*.db。只需新建一个空数据库文件即可,数据库表将通过EntityFrameworkCore来创建。DB Browser for SQLite是一个常见的SQLite管理工具,当然还有很多其他的收费或免费的工具。

将新建的SwitchDB.db文件拷贝到启动项SwitchDatabase工程中,并将属性中的Copy to Output Directory更改为Copy if newer,SwitchDB文件会在编译后拷贝到运行目录。
同时不要忘记给SwitchDatabase工程添加对DataAccess.SQLite工程的引用。

我们将Class1.cs修改为TodoSQLiteContext,和SQLServer所用的DbContext唯一的不同只有连接字符串。

namespace DataAccess.SQLite
{
    public class TodoSQLiteContext : DbContext
    {
        public DbSet<TodoItem> TodoItems { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder options)
            => options.UseSqlite("Data Source=SwitchDB.db");
    }
}

 

通过前篇提到的,在Package Manager Console窗口中使用Add-Migration和Update-Database命令来创建数据库表到SQLite数据库中。

在完成上述步骤后,当前工程适配SQLite的工作即已完成。接下来,就是在SwitchDatabase工程中的Program文件中,将原先连接到SQLServer的TodoContext替换成TodoSQLiteContext。

namespace SwitchDatabase
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            using (var dbContext = new TodoSQLiteContext())
            //using (var dbContext = new TodoContext())
            {
                var count = dbContext.TodoItems.Count();
                var item = new TodoItem { Name = $"test{++count}" };
                dbContext.Add(item);
                dbContext.SaveChanges();
            }
        }
    }
}

按F5运行程序,然后再通过DB Browser for SQLite打开..\SwitchDatabase\bin\Debug\net5.0目录下的SwtichDB.db文件,即可以看到我们插入的数据了。

本篇我们介绍了如何通过EntityFrameworkCore切换支持SQLServer和SQLite的基本概念。
GitHub:
https://github.com/manupstairs/EntityFrameworkCoreSamples/tree/main/SwitchDatabaseSample