共计 2104 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点
在传统开发中,我们常常遇到以下问题:

- 手动编写 SQL 脚本创建数据库表,耗时且容易出错
- 模型类修改后,需要手动同步数据库结构,容易遗漏
- 团队成员之间数据库结构不一致,导致运行时报错
- 缺乏版本控制,难以追踪数据库结构变更历史
技术对比
Entity Framework Core 提供了三种主要的工作流:
- Code First
- 优点:完全面向对象,模型驱动,易于版本控制
-
缺点:需要学习迁移命令,对复杂数据库支持有限
-
Database First
- 优点:从现有数据库生成模型,适合已有数据库项目
-
缺点:模型更新需要重新生成,可能丢失自定义代码
-
Model First
- 优点:可视化设计器,适合快速原型开发
- 缺点:生成的代码可能不够灵活,维护成本高
对于新项目,推荐使用 Code First 方式,它提供了最好的开发体验和可维护性。
核心实现
1. 定义模型类
首先创建一个简单的 Product 模型:
public class Product
{
// 主键,自增
public int Id {get; set;}
// 商品名称,必填,最大长度 100
[Required]
[MaxLength(100)]
public string Name {get; set;}
// 价格,精度 18 位,小数 2 位
[Column(TypeName = "decimal(18,2)")]
public decimal Price {get; set;}
// 库存数量
public int Stock {get; set;}
// 上架时间
public DateTime ListedDate {get; set;} = DateTime.Now;
}
2. 配置 DbContext
创建应用 DbContext 类:
public class AppDbContext : DbContext
{public DbSet<Product> Products { get; set;}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// 使用 SQL Server 数据库,连接字符串应从配置读取
optionsBuilder.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=MyShop;Trusted_Connection=True;");
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
// 使用 Fluent API 进行高级配置
modelBuilder.Entity<Product>()
.Property(p => p.Name)
.IsRequired()
.HasMaxLength(100);
modelBuilder.Entity<Product>()
.Property(p => p.Price)
.HasColumnType("decimal(18,2)");
}
}
3. 执行迁移命令
- 安装 Entity Framework Core 工具:
dotnet tool install --global dotnet-ef
- 添加初始迁移:
dotnet ef migrations add InitialCreate
- 更新数据库:
dotnet ef database update
生产环境注意事项
迁移脚本版本管理
- 将迁移文件 (.cs) 纳入源代码控制
- 每个环境 (dev/test/prod) 应使用独立的迁移历史
- 禁止直接修改已应用的迁移
敏感数据处理
// 在 DbContext 中重写 ConfigureConventions 方法
protected override void ConfigureConventions(ModelConfigurationBuilder configurationBuilder)
{configurationBuilder.Properties<string>()
.HaveMaxLength(100); // 全局设置字符串默认长度
configurationBuilder.Properties<DateTime>()
.HaveColumnType("datetime2"); // 统一使用 datetime2
}
性能优化
- 批量操作使用 AddRange/RemoveRange
- 禁用跟踪查询时使用 AsNoTracking()
- 复杂查询考虑使用原始 SQL
常见问题排查
- 迁移失败:表已存在
-
解决方案:删除数据库或使用
-f强制更新 -
种子数据不生效
- 确保在迁移的
Up方法中添加了种子数据 -
或在 DbContext 的
OnModelCreating中配置 -
连接字符串错误
- 检查连接字符串格式
-
确保数据库服务已启动
-
模型变更未检测到
- 确保模型类是 public 的
- 检查是否添加了 DbSet 属性
思考与实践
- 尝试在现有模型中添加一个 Category 类,并建立与 Product 的一对多关系
- 研究如何在迁移中添加初始数据
- 探索如何在不同环境 (开发 / 测试 / 生产) 使用不同数据库配置
通过本指南,您应该能够熟练使用 EF Core 的 Code First 方式管理数据库结构。这种工作流可以显著提高开发效率,特别是在敏捷开发环境中。记住要经常提交迁移文件,并保持开发团队间的同步。
正文完
