EntityFramework Code First 是从代码生成数据库,叫做数据迁移。EntityFramework Database First 是从数据库生成代码,叫做脚手架(Scaffold)。本文介绍脚手架入门。

用数据库图形界面(如SQLiteStudio)生成数据库模式,插入数据等,已经发展成熟,标准化了,非常直观,即使是生手也很容易掌握。所以推荐先构建数据库,用脚手架生成代码。不要使用数据迁移从代码生成数据库。

新建C#项目,安装NuGet包:

Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Sqlite

打开命令行安装Entity Framework Core 工具:

# 安装 Entity Framework Core 工具
dotnet tool install --global dotnet-ef
 
# 更新 Entity Framework Core 工具
dotnet tool update --global dotnet-ef

安装VS插件:EntityFramework Core Scaffolding,他实际是运行命令行dotnet ef dbcontext scaffold命令。这个插件只是方便命令的参数记忆,你也可以直接使用命令行,请搜索微软帮助,写的很详细。

设置连接字符串,提供程序,其他可保持默认。如果生成代码不满意,可以修改参数后重新生成代码覆盖旧代码。

{
  "DataSource": "Data Source=flange.db",
  "Provider": "Microsoft.EntityFrameworkCore.Sqlite",
 ...
}

上下文类可以将手写代码放在单独的偏类文件中,将来自动生成代码不会覆盖手写文件。我们经常会配置连接字符串,自动代码不会生成,我们就将他放到自动代码不同的文件名称,单独文件中,不会被覆盖。如自动生成的上下文类文件名是FlangeDbContext.cs,你可以添加一个FlangeDbContext.OnConfiguring.cs文件到项目根位置:

using System;
using System.IO;

using Microsoft.EntityFrameworkCore;

using UnquotedJson;

public partial class FlangeDbContext : DbContext
{
    public FlangeDbContext()
    {
        var path = Path.Combine(Environment.CurrentDirectory, "app.config");
        //var text = File.ReadAllText(path);
        //var json = Json.parse.Invoke(text);
        //var connectionString = json["connectionString"].stringText;
        this.ConnectionString = "Data Source=flange.db";

    }
    public string ConnectionString { get; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured) {
            optionsBuilder.UseSqlite(this.ConnectionString);
        }
    }
}

sqlite 连接字符串的设置参见下面链接:

https://learn.microsoft.com/en-us/dotnet/standard/data/sqlite/connection-strings

重新生成文件前,应先清空旧的文件,不要依赖文件覆盖功能。否则,有时会仅大小写不同的文件不会被创建,或者多出孤立过时的实体文件。