什么是ORM?在C#中如何使用Entity Framework实现ORM?

来源:站长论坛作者:孙悟空头衔:草根站长
导读:本期聚焦于小伙伴创作的《什么是ORM?在C#中如何使用Entity Framework实现ORM?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《什么是ORM?在C#中如何使用Entity Framework实现ORM?》有用,将其分享出去将是对创作者最好的鼓励。

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

什么是ORM?在C#中如何使用Entity Framework实现ORM?

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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。