Entity Framework Core的Code First模式是C#开发中常用的数据库构建方式,开发者只需要编写业务对应的实体类和数据库上下文,就可以让框架自动生成匹配的数据库表结构,不需要手动编写SQL建表语句,非常适合快速迭代的开发场景。
环境准备
首先需要在项目中安装Entity Framework Core的相关依赖包,以.NET 6及以上版本的控制台项目为例,通过NuGet安装以下两个核心包:
- Microsoft.EntityFrameworkCore.SqlServer:用于连接SQL Server数据库
- Microsoft.EntityFrameworkCore.Tools:用于执行数据库迁移命令
定义实体类
实体类对应数据库中的表,类的属性对应表的字段,我们先定义两个简单的业务实体:用户表和订单表,两者存在一对多的关联关系。
// 用户实体,对应数据库中的Users表
public class User
{
// 主键,EF Core默认会将Id或类名+Id的属性作为主键
public int Id { get; set; }
// 用户名,后续会配置长度约束
public string UserName { get; set; }
// 用户邮箱
public string Email { get; set; }
// 导航属性,一个用户可以有多个订单
public List<Order> Orders { get; set; }
}
// 订单实体,对应数据库中的Orders表
public class Order
{
public int Id { get; set; }
// 订单金额
public decimal Amount { get; set; }
// 下单时间
public DateTime CreateTime { get; set; }
// 外键,关联用户表的主键
public int UserId { get; set; }
// 导航属性,订单属于一个用户
public User User { get; set; }
}
配置数据库上下文
数据库上下文是Entity Framework Core操作数据库的核心类,需要继承DbContext,并在其中配置实体集合和数据库连接信息。
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
// 定义实体对应的DbSet,每个DbSet对应一张数据库表
public DbSet<User> Users { get; set; }
public DbSet<Order> Orders { get; set; }
// 配置数据库连接字符串,这里使用SQL Server本地实例
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("Server=localhost;Database=EFCoreCodeFirstDemo;Trusted_Connection=True;TrustServerCertificate=True");
}
// 配置实体的额外规则,比如字段长度、外键关系等
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 配置User实体的UserName字段最大长度为50,且不能为空
modelBuilder.Entity<User>()
.Property(u => u.UserName)
.HasMaxLength(50)
.IsRequired();
// 配置User实体的Email字段最大长度为100
modelBuilder.Entity<User>()
.Property(u => u.Email)
.HasMaxLength(100);
// 配置Order和User的一对多关系,级联删除规则为当用户删除时,关联的订单也删除
modelBuilder.Entity<Order>()
.HasOne(o => o.User)
.WithMany(u => u.Orders)
.HasForeignKey(o => o.UserId)
.OnDelete(DeleteBehavior.Cascade);
}
}
执行数据库迁移
实体类和上下文配置完成后,就可以通过迁移命令生成数据库表结构了,打开NuGet包管理器控制台,依次执行以下命令:
首先创建初始迁移文件:
Add-Migration InitialCreate
执行完成后,项目会生成一个Migrations文件夹,里面包含迁移的快照和具体的表结构变更逻辑。接着执行更新数据库命令,将迁移应用到数据库:
Update-Database
执行成功后,打开SQL Server管理器,可以看到已经自动创建了EFCoreCodeFirstDemo数据库,以及Users和Orders两张表,表结构和我们定义的实体类、配置规则完全一致。
基础增删改查操作
数据库生成后,就可以通过上下文操作数据了,以下是常见的增删改查示例:
class Program
{
static void Main(string[] args)
{
using (var context = new AppDbContext())
{
// 新增用户
var newUser = new User
{
UserName = "张三",
Email = "zhangsan@ipipp.com",
Orders = new List<Order>
{
new Order { Amount = 199.9m, CreateTime = DateTime.Now },
new Order { Amount = 299.9m, CreateTime = DateTime.Now.AddDays(1) }
}
};
context.Users.Add(newUser);
context.SaveChanges();
Console.WriteLine($"新增用户成功,用户Id为:{newUser.Id}");
// 查询用户
var user = context.Users.FirstOrDefault(u => u.UserName == "张三");
if (user != null)
{
Console.WriteLine($"查询到用户:{user.UserName},邮箱:{user.Email}");
// 加载关联的订单数据
context.Entry(user).Collection(u => u.Orders).Load();
Console.WriteLine($"该用户的订单数量:{user.Orders.Count}");
}
// 修改用户
if (user != null)
{
user.Email = "zhangsan_new@ipipp.com";
context.SaveChanges();
Console.WriteLine("用户邮箱修改成功");
}
// 删除用户,由于配置了级联删除,关联的订单也会被删除
if (user != null)
{
context.Users.Remove(user);
context.SaveChanges();
Console.WriteLine("用户删除成功,关联的订单也已被删除");
}
}
}
}
后续实体变更处理
如果后续需要新增实体或者修改现有实体的结构,比如给User类新增一个年龄字段,只需要修改实体类后,再次执行迁移命令:
Add-Migration AddUserAge Update-Database
Entity Framework Core会自动对比之前的迁移快照,生成对应的表结构变更脚本,不需要手动修改数据库。
Entity_Framework_CoreCode_FirstC#数据库迁移实体类修改时间:2026-06-13 17:33:42