一文读懂 C# 中的 ORM 与对象关系映射
一文读懂 C# 中的 ORM 与对象关系映射
在C#开发中,数据库交互是业务开发的核心环节,而ORM(对象关系映射,Object-Relational Mapping) 是连接代码对象与关系型数据库的关键技术,其中映射更是ORM实现功能的底层核心。本文结合通俗讲解、代码实例,全面介绍映射概念、ORM原理、使用方式、优缺点及主流框架。
一、什么是映射?
一句话概括:映射就是建立C#实体类对象与数据库表、字段、行数据的对应规则,实现两边数据自动互通转换。
1. 两端数据结构对照
映射关系存在于代码层与数据库层两个体系中,二者结构一一对应:
- 数据库侧
数据库以表为基本单位,一张表代表一类业务数据;表中行是单条具体数据,列(字段) 代表数据的某一项属性。
以用户表User为例:
| id(int) | name(varchar) | age(int) |
|---|---|---|
| 1 | 张三 | 20 |
| 2 | 李四 | 22 |
- C# 代码侧
代码中使用实体类(Model) 对应数据表,类中的属性对应表字段,通过new创建的类对象,则对应数据表中的一行记录。
与上方用户表对应的实体类代码:
// 实体类:对应整张数据库表
public class User
{
// 属性:对应表中的字段
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
2. 映射的本质与作用
映射本质是一套配对规则,用来告知框架:C# 哪个类对应哪张数据表、类的哪个属性对应表的哪个字段。
标准配对关系如下:
- C# 实体类
User↔ 数据库表User - 类属性
Id↔ 表字段id - 类属性
Name↔ 表字段name - 类实例对象
User u = new User()↔ 数据表单行数据
依托这套规则,ORM框架可实现数据双向自动转换:
- 查询数据:从数据库读取一行数据,自动封装为C#实体对象;
- 写入数据:给C#实体对象赋值,框架自动生成SQL语句,将数据存入数据库。
3. 两种常用映射写法
根据命名是否一致,映射分为约定映射和手动特性映射两种:
- 约定映射(默认规则)
最常用的方式,依靠名称自动匹配:类名=表名、属性名=字段名,无需额外配置,上文的User类即可直接使用。 - 手动特性映射(名称不一致时使用)
当数据库表名、字段名和代码命名不同时,通过[Table]、[Column]特性显式指定映射关系:
// 指定类对应数据库表 t_user
[Table("t_user")]
public class User
{
// 指定属性对应数据库字段 user_name
[Column("user_name")]
public string Name { get; set; }
}
4. 原生写法与映射写法对比
在没有ORM框架时,开发者需要使用原生ADO.NET手动完成映射,逐行读取数据库字段并为实体属性赋值,代码冗余且重复度高:
// 原生ADO.NET 手动映射(伪代码)
reader.Read();
User u = new User();
u.Id = (int)reader["id"];
u.Name = (string)reader["name"];
u.Age = (int)reader["age"];
使用ORM框架后,框架自动根据映射规则完成数据转换,仅需一行代码就能获取实体对象,大幅简化开发:
// Dapper 借助映射自动封装对象
User u = conn.QueryFirst<User>("select * from User where id=1");
二、ORM 技术全面解析
1. ORM 基本定义
ORM(Object-Relational Mapping,对象关系映射)是一种编程技术,专门用于打通面向对象的C#代码与关系型数据库两种不同的数据模型。它在代码和数据库之间建立抽象层,让开发者以操作对象的方式间接操作数据库,不必频繁手写SQL语句。
2. ORM 核心工作原理
- 定义实体模型:编写实体类,用类和属性描述数据结构,对应数据库表与字段;
- 配置映射规则:通过约定或特性标注,绑定实体与数据表的对应关系;
- 对象化数据操作:调用ORM框架API对实体对象做增删改查;
- 框架自动转换:ORM将对象操作自动翻译为标准SQL执行,并把数据库返回结果转回实体对象;
- 附加优化能力:多数ORM支持结果缓存、延迟加载等功能,提升数据访问效率。
3. C# 主流 ORM 框架
目前C#生态中使用最广泛的ORM框架各有定位,可根据项目场景选择:
- Entity Framework (EF):微软官方框架,功能全面、生态完善,支持LINQ查询与多数据库适配,适合大中型项目;
- Dapper:轻量级ORM,性能接近原生ADO.NET,体量小、上手简单,适合追求高性能、需要自主控制SQL的场景;
- SqlSugar:国内热门国产ORM,语法简洁、链式查询、强 LINQ 支持,跨平台、全数据库兼容、分表分库、读写分离、租户、数据审计一站式;
- FreeSql:开源国产跨平台ORM,支持多数据库、多租户、动态表、导航属性、延迟加载、数据追踪、AOP,动态实体、分表、多库事务能力突出。
以EF为例,简单演示对象化数据库操作:
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
// EF 数据操作
using (var context = new MyDbContext())
{
// 新增数据
var product = new Product { Name = "Laptop", Price = 1200.00m };
context.Products.Add(product);
context.SaveChanges();
// 条件查询数据
var products = context.Products.Where(p => p.Price > 1000).ToList();
}
4. ORM 的优缺点
(1)核心优势
- 提升开发效率:省去重复编写SQL、手动数据转换的工作,聚焦业务逻辑开发;
- 代码简洁易维护:采用面向对象写法,语义清晰,数据库结构变更时仅需修改实体类即可;
- 跨数据库兼容:主流ORM支持SQL Server、MySQL、Oracle等多种数据库,项目迁移、切换数据库成本低;
- 降低安全风险:框架会自动转义用户输入,有效防范SQL注入攻击。
(2)存在短板
- 性能损耗:相比手写优化后的原生SQL,ORM存在少量额外开销,超大数据量、高并发极致性能场景会受影响;
- 存在学习成本:不同框架的语法、配置、特性各不相同,需要单独学习掌握;
- 复杂场景受限:多表复杂联查、特殊数据库语法,使用ORM实现会比较繁琐。
三、总结
映射是ORM技术的底层基础,类对应表、属性对应字段、对象对应行数据是最核心的对应逻辑。而ORM依托映射规则,彻底改变了传统数据库开发模式:将繁琐的SQL编写、数据手动转换工作交由框架处理,让开发者用面向对象的思维操作数据库。
在实际项目开发中,可结合业务场景选型:常规业务系统优先使用EF等全能型框架;高性能接口、数据查询场景选用轻量的Dapper;极致性能、复杂SQL场景,则可结合原生SQL与ORM搭配使用,扬长避短。

浙公网安备 33010602011771号