示例程序基于 .NET 6,在 Visual Studio 2022 中进行程序编写。使用 Console 控制台应用程序。
创建工程
新建一个工程,选择工程的类型为 Console App:

将工程命名为 EFCoreTest:

点击【下一步】,使用 .NET 6.0 框架,这是一个长期维护的版本。如果已经熟悉顶级语句,可以不选中 Do not use top-level statement 选项。如果习惯了要看到 program.cs 文件中有 Main 方法,则选中:

完成:

安装 Entity Framework Core 相关包
Entity Framework Core 支持不同的数据库,比如 SQL Server, MySQL 等,要求不同的数据库厂商提供数据驱动程序。我们在本例中将使用 SQL Server LocalDB,这是一种基于文件的数据库,是 SQL Server 最精简的版本。安装 Visual Studio 的时候,可以选择同时安装这个精简的数据库。
通过菜单 Tools -> NuGet Package Manager -> Manage NuGet Packages for Solution 进行可视化安装。

我们将按装如下两个 Package:

如果安装成功,这里显示了 Package 和版本:

定义实体类
在工程中新建一个 Models 文件夹,添加一个名为 Book 的实体类:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace EFCoreTest.Models
{
public class Book
{
public int Id { get; set; }
public string Title { get; set; }
public string AuthorName { get; set; }
public DateTime PublishDate { get; set; }
public double Price { get; set; }
}
}
定义实体配置类
实体配置类的主要作用是设置实体与数据表映射的数据表相关属性。EF Core 按照约定大于配置的原则,提供了大量默认的配置,但如果需要更加个性的设置,则可以在实体配置类中进行。实体配置类需要实现 IEntityTypeConfiguration 接口。

编写 Configure 方法的代码如下:
namespace EFCoreTest.Models
{
public class BookEntityConfig : IEntityTypeConfiguration<Book>
{
public void Configure(EntityTypeBuilder<Book> builder)
{
builder.ToTable("T_Books"); // 指定 Book 对应的数据库表为T_Books
builder.Property(c=>c.Title).IsRequired().HasMaxLength(50);
builder.Property(c=>c.AuthorName).IsRequired().HasMaxLength(20);
}
}
}
上面的代码比较直观,简单来说,对数据库表有如下配置:
1)数据库表名为 T_Books
- Title 字段为必输字段,最大长度为 50
3)AuthorName 字段为必输字段,最大长度为 20
定义上下文类
EF Core 对数据库的操作需要通过继承自 DbContext 的类来进行。DbSet 类代表对应的数据库表。在 Models 文件夹下,创建名为 BookDbContext 的类,继承自 DbContext:

我们需要 override DbContext 的两个方法,在 OnConfiguring 方法中设置连接字符串,并且根据该连接字符串配置,连接到相应数据库:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 连接字符串
string connStr = "Server=(localdb)\\ProjectModels;Database=BookDb;Trusted_Connection=True";
optionsBuilder.UseSqlServer(connStr);
}
这里,连接字符串要有实际存在的数据库与之对应,通过菜单 View -> SQL Server Object Explorer 菜单,可以看到该数据库:

改写 OnModelCreating 方法:
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 加载当前Assemby所有实现了IEntityConfiguration的类
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
}
数据库迁移
通过菜单 Tools -> NuGet Package Manager -> Package Manager Console 打开命令行界面:

运行 Add-Migration 命令:

运行该命令后,在工程中生成数据库迁移的脚本,InitialCreate 是数据迁移的名称,该名称表示这是第一次迁移。此时还没有作用于实际的数据库。

接下来,运行 Update-Database 命令,生成实际的数据表:


网友评论