第一章: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该不该用单例、什么时候该手动释放资源等等。
先消化一下今天的内容,动手跑通第一个程序。有任何问题,欢迎交流。