从零开始的.NET项目(一)配置EFCore
目标框架:.net6.0
操作系统:mac os
编译器:Rider
内容:配置EFCore,使用CodeFrist创建mssql数据库,并存入种子数据
数据库准备
如果使用的是vs编译器的话,其实就不用准备数据库了,直接用vs自带的数据库,嘎嘎好使😋。
但笔者使用的是mac,所以就用docker镜像来准备mssql了。具体操作后续再单开一节来详细介绍 再水一篇。
运行起来数据库别忘了创建个库哈,等下连接数据库要用呢。
代码准备
安装nuget包
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Tools
创建你的数据库Model文件
public class YourModel
{
[Key]
public Guid Id { get; set; }
[Required]
public string Name { get; set; }
}
上述代码中,属性需要有什么特性就在对应属性上标注特性就好,常用的有Key
Require
MaxLength
Colume
等,每个属性标注的特性在官方文档中有详细描述,就不过多赘述 我懒。
创建数据库上下文
public class AppDBContext : DbContext
{
public AppDBContext(DbContextOptions<AppDBContext> options)
: base(options)
{
}
//模型映射数据库表
public DbSet<YourModel> YourModels { get; set; }
}
上述就是一个最简单的DbContext类,该类其实就是在创建数据模型和数据库表之间找到映射关系。
注入服务
首先将准备好的数据库连接字符串放入appsettings.json
配置文件。如下
"ConnectionStrings": {
"ConnectionString": "server=localhost; Database=数据库名; User Id=用户; Password=密码.;Encrypt=True;TrustServerCertificate=True;"
}
然后注入服务,笔者使用的是.net6框架,直接将下方代码塞进Program.cs
就好。
如果再早的框架,比如说.net3.1,就放进StartUp.cs
文件,当然具体语法会有小改动。
builder.Services.AddDbContext<AppDBContext>(options =>
{
//三种读取配置方式
var connectionString = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build()
.GetConnectionString("ConnectionString");
connectionString = builder.Configuration.GetConnectionString("ConnectionString");
connectionString = builder.Configuration.GetSection("ConnectionStrings")["ConnectionString"];
//connectionString = "server=localhost; Database=xiechengDb; User Id=SA; Password=sa123456.;Encrypt=True;TrustServerCertificate=True;";
//调用sqlserver配置,加载数据库
options.UseSqlServer(connectionString);
});
建库
使用vs编译器的话,直接用自带的程序包管理控制台就可以,如下
dotnet ef migrations 随便起个名字
otnet ed database update
mac的话其实指令是一样的,只不过运行位置稍有变化。如下图
在打开的终端里面输入上述指令就好。
做种
笔者本地运行项目目的主要是为了测试或者试一些新东西,所以一般就需要一些初始数据,这时候其实可以通过重写DbContext
类的OnModelCreating()
函数,在进行数据库迁移时,把种子数据写入数据库。
下面介绍两种方式,分别为代码写入和json文件写入。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//代码写入
modelBuilder.Entity<YourModel>().HasData(new YourModel()
{
Id = Guid.NewGuid(),
Title = "ceshi"
});
//文件写入 找到你自己的json文件地址
var jsonData = File.ReadAllText(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) +
@"data.json");
IList<YourModel> dataList = JsonConvert.DeserializeObject<IList<YourModel>>(jsonData);
modelBuilder.Entity<YourModel>().HasData(dataList);
}