第一章:EF Core 入门:ORM概念、EF Core发展史、为什么选择EF Core、第一个控制台应用

1.1 什么是ORM?我当年是怎么理解的

先聊聊ORM吧。说白了,ORM就是「对象关系映射」的缩写。

你想想看,我们写代码用的是C#,数据存在数据库里。C#里是对象、类、属性,数据库里是表、行、列。这两者天生就不一样。每次都要手动写SQL把数据塞进对象里,或者把对象拆成SQL插进去,烦不烦?

ORM就是帮你干这个脏活累活的。它让你用操作对象的方式去操作数据库。

我记得刚入行那会儿,项目里全是手写ADO.NET。一个查询要写Connection、Command、DataReader,还要自己拼参数防止SQL注入。那时候我就想,要是能像操作List一样操作数据库该多好。后来遇到EF Core,嗯,就是它了。

核心概念一句话:ORM让你用面向对象的方式操作关系型数据库,不用写SQL。

1.2 EF Core的发展史——从EF6到EF Core的变迁

EF Core不是凭空冒出来的。它前面有个老大哥叫Entity Framework(简称EF6)。

EF6是.NET Framework时代的产物,功能很全,但有个致命问题——太重了。它只能在Windows上跑,而且内部实现非常复杂。我当年用EF6做项目,光是配置就折腾了半天,启动还慢。

后来微软推出了.NET Core,跨平台了。EF也必须跟着改。于是EF Core诞生了。

版本 发布时间 主要变化
EF Core 1.0 2016年 第一个跨平台版本,功能简陋,很多EF6的特性没有
EF Core 2.0 2017年 性能提升,支持更多查询模式
EF Core 3.0 2019年 重大重构,去掉了EF6遗留的包袱,性能飞跃
EF Core 5.0 2020年 支持多对多、过滤包含等
EF Core 6.0 2021年 LTS版本,稳定成熟,推荐生产使用
EF Core 7.0/8.0 2022/2023年 持续优化性能,JSON列支持等

我个人建议,新项目直接上EF Core 6.0或8.0。别再用EF6了,它已经停止更新了。

1.3 为什么选择EF Core?我踩过的坑和真香时刻

你可能会问,市面上ORM那么多,Dapper、SqlSugar、NHibernate,为什么偏偏选EF Core?

我来说说我的真实感受。

第一,生产力高。 写代码快。你只需要定义好实体类,EF Core自动帮你生成表结构、自动帮你做增删改查。我曾经用EF Core三天搭完一个中型项目的数据库层,如果用Dapper,至少一周。

第二,Linq查询太香了。 你可以在C#里写强类型的查询,编译时就能发现错误。不用拼字符串SQL,不用怕字段名写错。

第三,迁移机制成熟。 数据库版本管理?EF Core的Migration功能直接搞定。我经历过手动维护SQL脚本的痛苦,改个字段名要改十几个文件。用EF Core后,一条命令搞定。

小提示:EF Core不是银弹。如果你追求极致性能,或者查询极其复杂,可以考虑Dapper。但80%的业务场景,EF Core完全够用,而且开发效率更高。

第四,社区活跃,生态好。 遇到问题,StackOverflow上一搜一大把。微软官方也在持续投入,版本迭代很快。

嗯,当然也有缺点。EF Core生成的SQL有时候不够优化,需要你手动干预。这个我们后面的章节会详细讲。

1.4 第一个控制台应用——动手实践

光说不练假把式。我们来写第一个EF Core程序。

假设我们要做一个简单的博客系统,先建一个「博客」表。

1.4.1 创建项目

dotnet new console -n EFCoreDemo
cd EFCoreDemo

1.4.2 安装EF Core包

我用的是SQLite,轻量级,适合入门。你如果用SQL Server,换成对应的包就行。

dotnet add package Microsoft.EntityFrameworkCore.Sqlite
dotnet add package Microsoft.EntityFrameworkCore.Design

1.4.3 定义实体类

public class Blog
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }
    public DateTime CreatedAt { get; set; }
}

1.4.4 创建DbContext

public class BlogDbContext : DbContext
{
    public DbSet<Blog> Blogs { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlite("Data Source=blog.db");
    }
}

1.4.5 写Main方法

using (var db = new BlogDbContext())
{
    // 创建数据库(如果不存在)
    db.Database.EnsureCreated();

    // 插入一条数据
    var blog = new Blog
    {
        Title = "我的第一篇博客",
        Content = "Hello EF Core!",
        CreatedAt = DateTime.Now
    };
    db.Blogs.Add(blog);
    db.SaveChanges();

    // 查询数据
    var blogs = db.Blogs.ToList();
    foreach (var b in blogs)
    {
        Console.WriteLine($"Id: {b.Id}, Title: {b.Title}");
    }
}

1.4.6 运行

dotnet run

如果一切顺利,你会看到控制台输出你刚插入的那条博客记录。

注意:EnsureCreated()只适合开发阶段快速测试。生产环境请使用Migration,否则数据库结构变更时会丢失数据。我曾经在测试环境用这个偷懒,结果改字段类型时数据全没了……嗯,血的教训。

1.5 本章小结

这一章我们聊了ORM是什么,EF Core怎么来的,为什么选它,以及动手写了第一个程序。

说白了,EF Core就是让你用面向对象的思维去操作数据库。它帮你省去了大量重复的SQL编写工作,让你专注于业务逻辑。

下一章,我们会深入DbContext的生命周期和配置。到时候我会分享一些我在项目中踩过的坑,比如DbContext该不该用单例、什么时候该手动释放资源等等。

先消化一下今天的内容,动手跑通第一个程序。有任何问题,欢迎交流。