ZetCode

ASP.NET DbSet

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中使用 Entity Framework Core 的 DbSet 类。DbSet 代表上下文中的实体集合,用于数据库操作。

Entity Framework Core 是一个轻量级、可扩展的 .NET ORM。DbSet 提供了查询和保存实体类实例的方法。它充当您的代码和数据库表之间的桥梁。

基本定义

DbSet是 Entity Framework Core 中一个映射到数据库表的实体集合的类。TEntity 是模型中的实体类型。

每个 DbSet 都对应一个数据库表,DbSet 中的每个实体代表该表中的一行。DbSet 提供了针对数据库的 LINQ 查询功能。

DbSet 包含添加、更新和删除实体的方法。更改由 DbContext 跟踪,并通过 SaveChanges 保存。它是 EF Core 中数据访问的主要类。

ASP.NET DbSet 示例

下面的示例演示了在 ASP.NET 8 Web API 中使用 DbSet。

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

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

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

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

这会配置应用程序使用 DbContext 和 SQL Server 数据库。连接字符串从配置文件 (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 将映射到具有匹配列的数据库表。Id 属性将是主键。

Data/ApplicationDbContext.cs
using Microsoft.EntityFrameworkCore;

public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> 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 }
        );
    }
}

ApplicationDbContext 包含 Products DbSet。OnModelCreating 方法用于填充初始数据。DbContextOptions 通过依赖注入进行注入。

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

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

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

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

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

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

    [HttpPut("{id}")]
    public async Task<IActionResult> UpdateProduct(int id, Product product)
    {
        if (id != product.Id) return BadRequest();
        
        _context.Entry(product).State = EntityState.Modified;
        await _context.SaveChangesAsync();
        return NoContent();
    }

    [HttpDelete("{id}")]
    public async Task<IActionResult> DeleteProduct(int id)
    {
        var product = await _context.Products.FindAsync(id);
        if (product == null) return NotFound();
        
        _context.Products.Remove(product);
        await _context.SaveChangesAsync();
        return NoContent();
    }
}

此控制器演示了使用 Products DbSet 执行 CRUD 操作。每个操作方法都异步执行数据库操作。DbContext 通过构造函数注入进行注入。

GetProducts 方法检索所有产品。GetProduct 按 ID 查找单个产品。CreateProduct 将新产品添加到数据库。UpdateProduct 修改现有产品。

DeleteProduct 从数据库中删除一个产品。所有方法都使用 async/await 以获得更好的可伸缩性。Entity Framework 跟踪更改,并在调用 SaveChangesAsync 时生成 SQL 命令。

来源

Microsoft EF Core DbContext 文档

在本文中,我们探讨了 ASP.NET 8 中使用 Entity Framework Core 的 DbSet。DbSet 为 .NET 中的数据库操作提供了强大的抽象。

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。到目前为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出所有 ASP.NET 教程