C# Model命令生成数据库表实战指南:从零到生产环境部署

1次阅读
没有评论

共计 2104 个字符,预计需要花费 6 分钟才能阅读完成。

image.webp

背景痛点

在传统开发中,我们常常遇到以下问题:

C# Model 命令生成数据库表实战指南:从零到生产环境部署

  • 手动编写 SQL 脚本创建数据库表,耗时且容易出错
  • 模型类修改后,需要手动同步数据库结构,容易遗漏
  • 团队成员之间数据库结构不一致,导致运行时报错
  • 缺乏版本控制,难以追踪数据库结构变更历史

技术对比

Entity Framework Core 提供了三种主要的工作流:

  1. Code First
  2. 优点:完全面向对象,模型驱动,易于版本控制
  3. 缺点:需要学习迁移命令,对复杂数据库支持有限

  4. Database First

  5. 优点:从现有数据库生成模型,适合已有数据库项目
  6. 缺点:模型更新需要重新生成,可能丢失自定义代码

  7. Model First

  8. 优点:可视化设计器,适合快速原型开发
  9. 缺点:生成的代码可能不够灵活,维护成本高

对于新项目,推荐使用 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. 执行迁移命令

  1. 安装 Entity Framework Core 工具:
dotnet tool install --global dotnet-ef
  1. 添加初始迁移:
dotnet ef migrations add InitialCreate
  1. 更新数据库:
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

常见问题排查

  1. 迁移失败:表已存在
  2. 解决方案:删除数据库或使用 -f 强制更新

  3. 种子数据不生效

  4. 确保在迁移的 Up 方法中添加了种子数据
  5. 或在 DbContext 的 OnModelCreating 中配置

  6. 连接字符串错误

  7. 检查连接字符串格式
  8. 确保数据库服务已启动

  9. 模型变更未检测到

  10. 确保模型类是 public 的
  11. 检查是否添加了 DbSet 属性

思考与实践

  1. 尝试在现有模型中添加一个 Category 类,并建立与 Product 的一对多关系
  2. 研究如何在迁移中添加初始数据
  3. 探索如何在不同环境 (开发 / 测试 / 生产) 使用不同数据库配置

通过本指南,您应该能够熟练使用 EF Core 的 Code First 方式管理数据库结构。这种工作流可以显著提高开发效率,特别是在敏捷开发环境中。记住要经常提交迁移文件,并保持开发团队间的同步。

正文完
 0
评论(没有评论)