.NET EF框架搭建教程

Entity Framework(EF)是.NET平台上强大的对象关系映射(ORM)框架,能够简化数据库操作,让开发者通过面向对象的方式与数据库交互,本文将详细介绍如何在.NET项目中搭建EF框架,包括环境准备、模型定义、数据库配置及基本操作。
环境准备
首先确保已安装以下工具:
- Visual Studio:推荐使用Visual Studio 2022,支持.NET 6/7/8等版本。
- .NET SDK:从官网下载对应版本的.NET SDK(如.NET 7.0)。
- 数据库:可选择SQL Server、SQLite或PostgreSQL等,本文以SQL Server为例。
安装完成后,创建新的.NET项目(如控制台应用或Web API),通过NuGet包管理器安装EF Core相关包:
Microsoft.EntityFrameworkCore
:核心包。Microsoft.EntityFrameworkCore.SqlServer
:SQL Server提供程序。Microsoft.EntityFrameworkCore.Tools
:命令行工具(用于迁移等操作)。
定义数据模型
模型类是EF与数据库交互的基础,需通过属性映射到数据库表结构,定义一个User
模型:

public class User { public int Id { get; set; } // 主键,EF默认自动识别 public string Name { get; set; } public string Email { get; set; } public DateTime CreatedAt { get; set; } = DateTime.Now; }
创建DbContext
DbContext
是EF的核心类,负责管理数据库连接和实体操作,创建一个ApplicationDbContext
类:
using Microsoft.EntityFrameworkCore; public class ApplicationDbContext : DbContext { public DbSet<User> Users { get; set; } // 对应Users表 public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { // 可在此处配置模型关系、约束等 base.OnModelCreating(modelBuilder); } }
配置数据库连接
在appsettings.json
中添加数据库连接字符串(以SQL Server为例):
{ "ConnectionStrings": { "DefaultConnection": "Server=.;Database=MyDb;Trusted_Connection=True;TrustServerCertificate=True;" } }
在程序启动时配置DbContext
(以控制台应用为例):
using Microsoft.EntityFrameworkCore; class Program { static void Main(string[] args) { var optionsBuilder = new DbContextOptionsBuilder<ApplicationDbContext>(); optionsBuilder.UseSqlServer("Server=.;Database=MyDb;Trusted_Connection=True;TrustServerCertificate=True;"); using (var context = new ApplicationDbContext(optionsBuilder.Options)) { // 初始化数据库(开发阶段) context.Database.EnsureCreated(); Console.WriteLine("数据库已创建或已存在。"); } } }
数据库迁移
当模型类发生变化时,需通过迁移同步数据库结构,步骤如下:

-
启用迁移:在项目目录下打开终端,运行:
Add-Migration InitialCreate
此命令会生成一个包含数据库变更的迁移文件。
-
应用迁移:运行以下命令更新数据库:
Update-Database
-
回滚迁移(可选):
Update-Database MigrationName
基本CRUD操作
通过DbContext
执行数据库操作:
添加数据
using (var context = new ApplicationDbContext(optionsBuilder.Options)) { var user = new User { Name = "张三", Email = "zhangsan@example.com" }; context.Users.Add(user); context.SaveChanges(); // 保存更改 }
查询数据
using (var context = new ApplicationDbContext(optionsBuilder.Options)) { var users = context.Users.Where(u => u.Name.Contains("张")).ToList(); foreach (var user in users) { Console.WriteLine($"ID: {user.Id}, Name: {user.Name}"); } }
更新数据
using (var context = new ApplicationDbContext(optionsBuilder.Options)) { var user = context.Users.FirstOrDefault(u => u.Id == 1); if (user != null) { user.Email = "newemail@example.com"; context.SaveChanges(); } }
删除数据
using (var context = new ApplicationDbContext(optionsBuilder.Options)) { var user = context.Users.FirstOrDefault(u => u.Id == 1); if (user != null) { context.Users.Remove(user); context.SaveChanges(); } }
高级配置
配置表名和列名
通过[Table]
和[Column]
特性自定义映射:
[Table("UserInfo")] public class User { [Column("UserId")] public int Id { get; set; } public string Name { get; set; } }
实体关系
定义Post
与User
的一对多关系:
public class User { public int Id { get; set; } public string Name { get; set; } public List<Post> Posts { get; set; } } public class Post { public int Id { get; set; } public string Title { get; set; } public int UserId { get; set; } public User User { get; set; } }
数据注解与Fluent API
复杂数据关系可通过OnModelCreating
中的Fluent API配置,
modelBuilder.Entity<Post>() .HasOne(p => p.User) .WithMany(u => u.Posts) .HasForeignKey(p => p.UserId);
性能优化建议
- 延迟加载:避免不必要的查询,使用
AsNoTracking()
提升查询性能。 - 批量操作:对于大量数据插入或更新,使用
AddRange
或UpdateRange
。 - 索引配置:通过
HasIndex
为常用查询字段添加索引。
相关问答FAQs
Q1:EF Core和EF6有什么区别?如何选择?
A:EF Core是跨平台、轻量化的重构版本,支持.NET Core和.NET 5+,性能更高且更灵活;EF6仅支持.NET Framework,适合传统项目,新项目推荐使用EF Core。
Q2:如何处理EF Core中的并发冲突?
A:可通过[ConcurrencyCheck]
特性或RowVersion
属性实现乐观并发控制。
public class User { public int Id { get; set; } [ConcurrencyCheck] public string Name { get; set; } }
在更新时,EF会检查数据库中的值是否与当前值一致,若不一致则抛出DbUpdateConcurrencyException
,需手动处理冲突。