EF Core 快速开始

EF Core 快速开始

安装ef包

1
2
Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.Design

注意不要安装成Microsoft.EntityFrameworkCore.Sqlite.Core最后带core结尾的不是。

实体模型

建个文件夹比如Db存放所有的实体模型。数据库Context类如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
namespace EasyRepo.Db
{
public class MainContext : DbContext
{
public MainContext()
{

}
public MainContext(DbContextOptions<MainContext> options) : base(options)
{
}

public DbSet<ItemCategory> ItemCategories { get; set; }
public DbSet<ItemProvider> ItemProviders { get; set; }
public DbSet<InputItem> InputItems { get; set; }
public DbSet<OutputItem> OutputItems { get; set; }

protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
if (!optionsBuilder.IsConfigured)
{
optionsBuilder.UseSqlite("Data Source=data.db");
}
}
}
}

其中一个实体类模板如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

namespace EasyRepo.Db
{
public class InputItem
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }

[Required]
public DateTime InputDate { get; set; }

[ForeignKey("CategoryId")]
public ItemCategory Category { get; set; }

[AllowNull]
public string Itemname { get; set; }

[ForeignKey("ProviderId")]
public ItemProvider Provider { get; set; }

[Required]
public decimal Count { get; set; }

[Required]
public decimal Price { get; set; }

[AllowNull]
public string Note { get; set; }
}
}

注意数据库一个表的外键必须使用诸如CategoryId这样的命名方式,否则迁移会报错。

迁移数据

1
2
3
4
5
6
7
8
# 新建迁移
dotnet ef migrations add InitialCreate

# 开始创建数据库
dotnet ef database update

# 如果提示版本过低,升级 ef 工具版本
dotnet tool update --global dotnet-ef

不使用依赖注入

如果不用类似ASP.NET那样的依赖注入来使用数据库,需要在 DbContext 同级目录下创建一个 DesignTimeDbContextFactory.cs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
namespace EasyRepo.Db
{
public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MainContext>
{
public MainContext CreateDbContext(string[] args)
{
var optionsBuilder = new DbContextOptionsBuilder<MainContext>();
optionsBuilder.UseSqlite("Data Source=data.db");

return new MainContext(optionsBuilder.Options);
}
}
}

这样让ef工具正确识别如何新建数据库。


EF Core 快速开始
https://taylorandtony.github.io/2025/01/25/csharp-efcore/
作者
TaylorAndTony
发布于
2025年1月25日
许可协议