使用 ASP.NET Core 与 Entity Framework Core 进行数据库操作

使用 ASP.NET Core 与 Entity Framework Core 进行数据库操作

Entity Framework Core(EF Core)是ASP.NET Core中的一个轻量级ORM框架,提供了以面向对象的方式与数据库进行交互的能力。本文将通过Visual Studio 2022详细介绍如何使用EF Core进行基本的数据库操作(CRUD),并展示一些进阶技巧,帮助初学者快速掌握该技术。

一、项目创建与配置

1. 创建ASP.NET Core Web API项目

  1. 打开Visual Studio 2022,选择"创建一个新项目"。
  2. 在项目模板中选择"ASP.NET Core Web API",点击"下一步"。
  3. 为项目命名,例如EFCoreDemo,选择保存位置,然后点击"创建"。
  4. 在"附加信息"对话框中,确保目标框架为.NET 6.0或更高版本,然后点击"创建"。

2. 添加Entity Framework Core依赖项

在项目创建完成后,依次执行以下步骤来添加EF Core相关的NuGet包:

  1. 右键点击项目名称,选择"管理NuGet程序包"。
  2. 在"浏览"选项卡中搜索Microsoft.EntityFrameworkCore.SqlServer并点击"安装"。
  3. 继续搜索并安装Microsoft.EntityFrameworkCore.Tools

这些包将帮助我们与SQL Server数据库交互并进行数据库迁移操作。

二、创建数据库上下文和模型

1. 创建模型类

在EF Core中,模型类用于映射数据库表。假设我们需要管理一本简单的图书馆数据库,首先我们创建一个Book类:

  1. 右键项目,在"添加"菜单中选择"新建文件夹",命名为Models
  2. Models文件夹下,右键选择"添加类",命名为Book.cs,并定义如下内容:
csharp 复制代码
namespace EFCoreDemo.Models
{
    public class Book
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string Author { get; set; }
        public DateTime PublishedDate { get; set; }
        public decimal Price { get; set; }
    }
}

2. 创建数据库上下文类

接下来,我们需要创建一个数据库上下文类LibraryContext,它将管理数据库连接并映射模型类到数据库表:

  1. 在项目根目录中创建一个新的文件夹命名为Data
  2. 右键点击Data文件夹,添加一个类命名为LibraryContext.cs,并定义如下内容:
csharp 复制代码
using EFCoreDemo.Models;
using Microsoft.EntityFrameworkCore;

namespace EFCoreDemo.Data
{
    public class LibraryContext : DbContext
    {
        public LibraryContext(DbContextOptions<LibraryContext> options) : base(options)
        {
        }

        public DbSet<Book> Books { get; set; }
    }
}

3. 配置数据库连接字符串

appsettings.json文件中配置数据库连接字符串,确保你的SQL Server实例可以访问:

json 复制代码
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=LibraryDb;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

然后在Program.cs中配置服务:

csharp 复制代码
using EFCoreDemo.Data;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

// 添加数据库上下文到服务容器
builder.Services.AddDbContext<LibraryContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));

builder.Services.AddControllers();

var app = builder.Build();

app.MapControllers();

app.Run();

三、执行数据库迁移

为了在数据库中创建相应的表结构,我们需要执行数据库迁移操作:

  1. 打开Visual Studio 2022中的"包管理器控制台"(工具 > NuGet 包管理器 > 包管理器控制台)。
  2. 输入以下命令来创建迁移并更新数据库:
powershell 复制代码
Add-Migration InitialCreate
Update-Database

Add-Migration命令会在项目中生成迁移文件,描述从空数据库到当前模型的变化。Update-Database命令则会根据迁移文件的定义在数据库中创建对应的表。

四、实现CRUD操作

1. 创建Controller

为了实现基本的CRUD操作,我们需要创建一个API控制器:

  1. 右键点击Controllers文件夹,选择"添加 > 控制器"。
  2. 选择"API控制器 - 使用Entity Framework",并点击"添加"。
  3. 在对话框中,选择Book模型类和LibraryContext数据上下文类,然后点击"添加"。

Visual Studio会自动生成一个名为BooksController的控制器,其中包含了基本的CRUD操作代码。

2. 实现获取所有书籍的操作

在生成的BooksController中,GetBooks方法如下所示:

csharp 复制代码
[HttpGet]
public async Task<ActionResult<IEnumerable<Book>>> GetBooks()
{
    return await _context.Books.ToListAsync();
}

该方法异步获取所有书籍记录,并返回给客户端。

3. 创建新书籍记录

PostBook方法用于创建新书籍:

csharp 复制代码
[HttpPost]
public async Task<ActionResult<Book>> PostBook(Book book)
{
    _context.Books.Add(book);
    await _context.SaveChangesAsync();

    return CreatedAtAction("GetBook", new { id = book.Id }, book);
}

该方法接收一个Book对象,将其添加到数据库中,并返回创建的记录。

4. 更新书籍记录

PutBook方法用于更新现有书籍:

csharp 复制代码
[HttpPut("{id}")]
public async Task<IActionResult> PutBook(int id, Book book)
{
    if (id != book.Id)
    {
        return BadRequest();
    }

    _context.Entry(book).State = EntityState.Modified;

    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!BookExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return NoContent();
}

该方法根据书籍ID更新对应的数据库记录。

5. 删除书籍记录

DeleteBook方法用于删除指定书籍:

csharp 复制代码
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteBook(int id)
{
    var book = await _context.Books.FindAsync(id);
    if (book == null)
    {
        return NotFound();
    }

    _context.Books.Remove(book);
    await _context.SaveChangesAsync();

    return NoContent();
}

该方法根据ID找到对应的记录并删除。

五、进阶技巧

1. 使用数据迁移管理数据变化

在实际开发中,数据库结构可能会随着需求变化而演进。使用EF Core的迁移功能,可以轻松管理这些变化,而无需手动修改数据库表。

2. 处理并发冲突

在多人访问数据库的情况下,可能会发生并发冲突。EF Core提供了并发冲突检测机制,你可以通过捕获DbUpdateConcurrencyException来处理这些冲突,并决定如何解决。

3. 配置实体关系

EF Core支持多种关系映射,如一对多、多对多等。通过在模型类中定义导航属性并使用Fluent API或数据注解,你可以精确控制数据库表之间的关系。

六、总结

本文详细介绍了如何在ASP.NET Core中使用Entity Framework Core进行数据库操作,从项目的创建到基本的CRUD操作,并展示了一些进阶技巧。通过学习这些内容,初学者可以快速上手并逐步深入掌握EF Core的使用。同时,进阶部分提供了在实际开发中处理复杂数据库操作的一些思路和方法,希望能对你的开发工作有所帮助。

相关推荐
NiNg_1_2342 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
Chrikk3 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*3 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue3 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man3 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
Ai 编码助手4 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
陈燚_重生之又为程序员4 小时前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle4 小时前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻5 小时前
MySQL排序查询
数据库·mysql
萧鼎5 小时前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步