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