ZetCode

ASP.NET DbContext

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 DbContext。DbContext 是 Entity Framework Core 应用程序中与数据库交互的主要类。

Entity Framework Core 是一个对象关系映射器 (ORM),它简化了 .NET 应用程序中的数据访问。DbContext 代表着与数据库的一个会话。

基本定义

DbContext 是您的域类和数据库之间的桥梁。它管理数据库连接,跟踪对象的更改,并执行 CRUD 操作。

DbContext 类是 Entity Framework Core 的一部分。它提供了基于 LINQ 的查询、更改跟踪和事务管理功能。

DbContext 使用实体类和 DbSet 属性。每个 DbSet 代表数据库中的一个表。上下文协调这些对象和数据库之间的关系。

ASP.NET DbContext 示例

以下示例演示了一个使用 DbContext 的完整 ASP.NET 应用程序。

Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<AppDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("Default")));

builder.Services.AddControllers();
var app = builder.Build();

app.MapControllers();
app.Run();

这通过 SQL Server 配置了应用程序的 DbContext。连接字符串从配置文件 (appsettings.json) 读取。

Models/Product.cs
public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public DateTime CreatedDate { get; set; } = DateTime.UtcNow;
}

这定义了一个简单的 Product 实体类。Entity Framework 将会将其映射到一个具有相应列的数据库表。

Data/AppDbContext.cs
using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) 
        : base(options) { }

    public DbSet<Product> Products { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Product>().HasData(
            new Product { Id = 1, Name = "Laptop", Price = 999.99m },
            new Product { Id = 2, Name = "Mouse", Price = 19.99m },
            new Product { Id = 3, Name = "Keyboard", Price = 49.99m }
        );
    }
}

这个 DbContext 子类定义了一个 Products DbSet 并填充了初始数据。OnModelCreating 方法配置模型并添加了示例数据。

Controllers/ProductsController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    private readonly AppDbContext _context;

    public ProductsController(AppDbContext context)
    {
        _context = context;
    }

    [HttpGet]
    public async Task<IActionResult> GetAll()
    {
        var products = await _context.Products.ToListAsync();
        return Ok(products);
    }

    [HttpGet("{id}")]
    public async Task<IActionResult> GetById(int id)
    {
        var product = await _context.Products.FindAsync(id);
        if (product == null) return NotFound();
        return Ok(product);
    }

    [HttpPost]
    public async Task<IActionResult> Create(Product product)
    {
        _context.Products.Add(product);
        await _context.SaveChangesAsync();
        return CreatedAtAction(nameof(GetById), new { id = product.Id }, product);
    }
}

此控制器演示了使用 DbContext 的基本 CRUD 操作。DbContext 通过构造函数依赖注入注入。

GetAll 方法异步检索所有产品。GetById 按 ID 查找单个产品。Create 将新产品添加到数据库。

DbContext 提供了 ToListAsync 和 FindAsync 等方法用于异步操作。SaveChangesAsync 将更改持久化到数据库。该控制器遵循 REST 约定。

来源

Microsoft EF Core DbContext 文档

在本文中,我们探讨了 ASP.NET 8 中的 DbContext。这个强大的类简化了数据库操作,并与 ASP.NET Core 无缝集成。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出所有 ASP.NET 教程