.NET EF框架搭建教程

Entity Framework(EF)是.NET框架中一款强大的对象关系映射(ORM)工具,它能够将数据库表映射为.NET对象,使开发者可以使用面向对象的方式操作数据库,而无需编写大量的SQL语句,本文将详细介绍如何使用.NET EF框架搭建一个数据访问层,包括环境准备、模型创建、数据库配置以及基本的增删改查操作。
我们需要准备开发环境,确保你的电脑上已经安装了.NET SDK(建议使用.NET 6或更高版本),以及一个集成开发环境(IDE),如Visual Studio 2022或Visual Studio Code,对于数据库,可以选择SQL Server、SQLite、MySQL等多种数据库,本教程以SQL Server为例进行讲解。
我们创建一个新的.NET项目,打开Visual Studio,选择“创建新项目”,然后选择“ASP.NET Core Web API”或“控制台应用程序”模板,为项目命名并点击“创建”,项目创建成功后,我们需要通过NuGet包管理器安装EF Core的相关包,在解决方案资源管理器中右键点击项目,选择“管理NuGet程序包”,搜索并安装以下包:
- Microsoft.EntityFrameworkCore:EF Core的核心包。
- Microsoft.EntityFrameworkCore.SqlServer:SQL Server数据库提供程序。
- Microsoft.EntityFrameworkCore.Tools:EF Core命令行工具。
- Microsoft.EntityFrameworkCore.Design:设计时支持包。
安装完成后,我们开始定义数据模型,假设我们要开发一个简单的博客系统,需要定义Blog
和Post
两个实体类,在项目中创建一个名为Models
的文件夹,并在其中创建Blog.cs
和Post.cs
文件。Blog
类包含BlogId
、Name
和Posts
属性,Post
类包含PostId
、Title
、Content
和Blog
属性,注意,在Blog
类中定义一个Posts
导航属性,类型为ICollection<Post>
,表示一个博客可以包含多篇文章;在Post
类中定义一个Blog
导航属性,类型为Blog
,表示每篇文章都属于一个博客。

定义好模型后,我们需要创建一个DbContext类,它是EF Core与数据库交互的核心,在项目中创建一个名为Data
的文件夹,添加一个ApplicationDbContext.cs
文件,使其继承自DbContext
,在ApplicationDbContext
类中,定义两个DbSet
属性:DbSet<Blog> Blogs
和DbSet<Post> Posts
,分别对应数据库中的Blogs
和Posts
表,重写OnConfiguring
方法,配置数据库连接字符串,在OnConfiguring
方法中,使用UseSqlServer
方法并传入你的SQL Server连接字符串。optionsBuilder.UseSqlServer("Server=.;Database=BlogDb;Trusted_Connection=True;");
。
我们需要初始化数据库,打开程序包管理器控制台(Package Manager Console),在“项目”下拉菜单中选择你的项目,然后执行以下命令:
Add-Migration InitialCreate
:此命令会根据你的模型类创建一个迁移类,用于生成数据库架构。Update-Database
:此命令会应用迁移,在数据库中创建相应的表。
执行成功后,你可以在SQL Server Management Studio中看到Blogs
和Posts
表已经创建成功。
我们可以开始进行数据操作了,在项目中创建一个Services
文件夹,添加一个BlogService.cs
文件,用于封装对Blog
实体的操作,在BlogService
类中,注入ApplicationDbContext
,然后实现创建博客、获取所有博客、根据ID获取博客、更新博客和删除博客等方法,创建博客的方法如下:

public async Task<Blog> CreateBlogAsync(Blog blog) { _context.Blogs.Add(blog); await _context.SaveChangesAsync(); return blog; }
获取所有博客的方法如下:
public async Task<List<Blog>> GetAllBlogsAsync() { return await _context.Blogs.ToListAsync(); }
为了测试这些方法,我们可以在ASP.NET Core Web API项目中创建一个控制器,在Controllers
文件夹中添加BlogsController.cs
文件,注入BlogService
,然后创建对应的API端点。
[ApiController] [Route("api/[controller]")] public class BlogsController : ControllerBase { private readonly BlogService _blogService; public BlogsController(BlogService blogService) { _blogService = blogService; } [HttpPost] public async Task<IActionResult> CreateBlog([FromBody] Blog blog) { var createdBlog = await _blogService.CreateBlogAsync(blog); return CreatedAtAction(nameof(GetBlog), new { id = createdBlog.BlogId }, createdBlog); } [HttpGet] public async Task<IActionResult> GetAllBlogs() { var blogs = await _blogService.GetAllBlogsAsync(); return Ok(blogs); } }
除了基本的CRUD操作,EF Core还支持更复杂的查询功能,如过滤、排序、分页等,要获取名称包含“ASP.NET”的所有博客,可以使用以下查询:
var blogs = await _context.Blogs .Where(b => b.Name.Contains("ASP.NET")) .OrderBy(b => b.Name) .ToListAsync();
EF Core还支持事务处理,确保多个操作要么全部成功,要么全部失败,在创建博客的同时创建一篇文章,可以使用以下代码:
using var transaction = await _context.Database.BeginTransactionAsync(); try { var blog = new Blog { Name = "Test Blog" }; _context.Blogs.Add(blog); await _context.SaveChangesAsync(); var post = new Post { Title = "First Post", Content = "Hello World", BlogId = blog.BlogId }; _context.Posts.Add(post); await _context.SaveChangesAsync(); await transaction.CommitAsync(); } catch { await transaction.RollbackAsync(); throw; }
在实际开发中,我们还需要考虑数据库迁移的管理,当模型发生变化时(如添加新属性、修改关系等),我们需要创建新的迁移并更新数据库,可以使用以下命令:
Add-Migration <MigrationName>
:创建一个新的迁移。Update-Database
:应用所有未应用的迁移。Script-Migration
:生成迁移脚本,可用于在其他环境中部署数据库更改。
EF Core还支持反向工程,即根据现有的数据库生成模型类和DbContext类,可以使用以下命令:
Scaffold-DbContext "Connection String" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
:根据数据库连接字符串生成模型和DbContext。
搭建.NET EF框架数据访问层的步骤包括:安装必要的NuGet包、定义实体模型、创建DbContext类、配置数据库连接、初始化数据库、实现数据操作方法以及测试功能,EF Core的强大功能可以大大提高开发效率,减少编写和维护SQL代码的工作量。
相关问答FAQs:
-
问:在使用EF Core时,如何处理数据库连接字符串的配置,以确保在不同环境(开发、测试、生产)中使用不同的连接字符串? 答:在ASP.NET Core应用中,推荐使用
appsettings.json
文件来管理不同环境的配置,在appsettings.Development.json
中定义开发环境的连接字符串,在appsettings.Production.json
中定义生产环境的连接字符串,然后在Program.cs
(或Startup.cs
)中,通过ConfigurationBuilder
加载这些配置文件,在ApplicationDbContext
的OnConfiguring
方法中,使用optionsBuilder.UseConfiguration(Configuration.GetConnectionString("DefaultConnection"))
来获取当前环境的连接字符串,这样,应用在运行时会根据当前环境(由ASPNETCORE_ENVIRONMENT
变量指定)自动加载对应的配置文件。 -
问:EF Core中的“跟踪”(Tracking)和“无跟踪”(No-Tracking)查询有什么区别?在什么情况下应该使用无跟踪查询? 答:EF Core的查询默认是“跟踪”模式,这意味着查询返回的实体会被DbContext跟踪,当这些实体被修改并调用
SaveChanges
时,EF Core会自动生成UPDATE语句来更新数据库,而“无跟踪”查询则不会跟踪返回的实体,对它们的修改不会被保存到数据库,无跟踪查询的主要优点是性能更好,因为EF Core不需要维护实体的变更状态,当只需要读取数据而不需要修改时,应该使用无跟踪查询,例如在只读的API端点或报表功能中,可以通过调用.AsNoTracking()
方法来执行无跟踪查询,var blogs = await _context.Blogs.AsNoTracking().ToListAsync();
。