ORM全称为Object Relational Mapping,即对象关系映射,是一种程序设计技术,用于实现面向对象编程语言里的对象与关系型数据库中的表结构之间的映射。通过ORM框架,开发者可以直接操作对象来完成数据库的增删改查,不需要手动编写大量原生SQL语句,大幅降低了数据库操作的复杂度,同时减少了SQL注入等安全风险。在C#生态中,Entity Framework是最主流的ORM框架,由微软官方维护,支持SQL Server、MySQL、PostgreSQL等多种数据库,提供了丰富的功能和良好的兼容性。

ORM的核心优势
ORM技术解决了面向对象编程与关系型数据库之间的范式不匹配问题,主要优势包括:
- 提升开发效率:不需要编写重复的CRUD SQL语句,直接通过对象操作完成数据交互
- 降低维护成本:数据库表结构变更时,只需要调整映射配置或实体类,不需要修改大量SQL代码
- 增强代码可读性:数据操作逻辑以面向对象的方式呈现,更符合开发者的编程习惯
- 内置安全机制:框架会自动处理参数化查询,避免大部分SQL注入攻击
Entity Framework的三种开发模式
Entity Framework支持三种不同的开发模式,开发者可以根据项目需求选择:
| 模式名称 | 适用场景 | 核心特点 |
|---|---|---|
| 代码优先(Code First) | 新项目开发,先设计实体类 | 通过实体类生成数据库表结构,支持数据迁移 |
| 数据库优先(Database First) | 已有数据库,需要生成对应代码 | 从现有数据库反向生成实体类和上下文类 |
| 模型优先(Model First) | 通过可视化模型设计数据库 | 通过EDMX模型文件生成数据库和实体类,使用场景较少 |
在C#中使用Entity Framework实现ORM的步骤
下面以最常用的代码优先模式为例,演示完整的实现流程,开发环境为Visual Studio,目标数据库为SQL Server。
1. 创建项目并安装依赖
首先创建一个C#控制台应用项目,然后通过NuGet包管理器安装Entity Framework相关包,需要安装EntityFramework和对应数据库的驱动包,这里使用SQL Server的话需要安装EntityFramework.SqlServer。
2. 定义实体类
实体类对应数据库中的表,类的属性对应表的字段,以下是一个用户实体类的示例:
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace EFDemo
{
// 指定对应的数据库表名,如果不指定则默认使用类名作为表名
[Table("Users")]
public class User
{
// 主键,自增
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
// 用户名,必填,最大长度50
[Required]
[MaxLength(50)]
public string UserName { get; set; }
// 邮箱,必填
[Required]
public string Email { get; set; }
// 创建时间,默认值为当前时间
public DateTime CreateTime { get; set; } = DateTime.Now;
}
}
3. 创建数据库上下文类
数据库上下文类是Entity Framework的核心,继承自DbContext,用于管理实体类与数据库之间的映射和交互:
using System.Data.Entity;
namespace EFDemo
{
public class AppDbContext : DbContext
{
// 构造函数,传入数据库连接字符串名称
public AppDbContext() : base("name=DefaultConnection")
{
}
// 定义DbSet属性,对应数据库中的Users表
public DbSet<User> Users { get; set; }
// 可选:配置模型映射规则
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// 可以额外配置映射规则,比如设置表名、字段类型等
modelBuilder.Entity<User>().Property(u => u.Email).HasMaxLength(100);
}
}
}
4. 配置数据库连接字符串
在项目的App.config或Web.config文件中添加数据库连接字符串,名称为上面构造函数中传入的DefaultConnection:
<configuration>
<connectionStrings>
<add name="DefaultConnection"
connectionString="Data Source=.;Initial Catalog=EFDemoDB;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
</configuration>
如果是连接远程数据库,可以将Data Source改为对应的数据库服务器地址,如果需要账号密码登录,可以修改连接字符串为Data Source=服务器地址;Initial Catalog=数据库名;User ID=账号;Password=密码。
5. 启用数据迁移并创建数据库
打开程序包管理器控制台,依次执行以下命令启用迁移并生成数据库:
# 启用迁移,会在项目中生成Migrations文件夹 Enable-Migrations # 添加迁移记录,后面跟的是迁移名称,可以自定义 Add-Migration InitialCreate # 更新数据库,执行迁移,创建对应的表结构 Update-Database
执行完成后,就可以在SQL Server中看到自动生成的EFDemoDB数据库和Users表,表结构会和定义的User实体类完全对应。
6. 实现基础CRUD操作
下面演示通过Entity Framework完成用户的增删改查操作:
using System;
using System.Linq;
namespace EFDemo
{
class Program
{
static void Main(string[] args)
{
// 创建上下文实例,使用using确保资源释放
using (var db = new AppDbContext())
{
// 1. 新增用户
var newUser = new User
{
UserName = "张三",
Email = "zhangsan@ipipp.com"
};
db.Users.Add(newUser);
db.SaveChanges(); // 执行保存,才会将修改提交到数据库
Console.WriteLine($"新增用户成功,Id为:{newUser.Id}");
// 2. 查询用户
var user = db.Users.FirstOrDefault(u => u.UserName == "张三");
if (user != null)
{
Console.WriteLine($"查询到用户:{user.UserName},邮箱:{user.Email}");
}
// 3. 修改用户
if (user != null)
{
user.Email = "zhangsan_new@ipipp.com";
db.SaveChanges();
Console.WriteLine("用户邮箱修改成功");
}
// 4. 删除用户
if (user != null)
{
db.Users.Remove(user);
db.SaveChanges();
Console.WriteLine("用户删除成功");
}
}
}
}
}
注意事项
在使用Entity Framework时,需要注意以下几点:
- 每次对实体类进行修改后,都需要执行Add-Migration和Update-Database命令来更新数据库结构
- 对于大量数据的查询,尽量使用
AsNoTracking()方法,避免实体被上下文跟踪,提升查询性能 - 复杂的查询场景可以使用LINQ语句,Entity Framework会自动将LINQ转换为对应的SQL语句执行
- 生产环境中建议关闭数据库初始化策略,避免自动删除或创建数据库导致数据丢失
Entity Framework还支持很多高级功能,比如懒加载、显式加载、事务处理、存储过程映射等,开发者可以根据实际需求进一步学习相关用法。
ORMEntity_FrameworkC#修改时间:2026-07-19 22:33:34