首页
/ EF Core入门教程:从零开始构建Pizza配送系统数据库

EF Core入门教程:从零开始构建Pizza配送系统数据库

2025-06-29 08:49:48作者:柯茵沙

前言

Entity Framework Core(简称EF Core)是微软推出的轻量级、可扩展、跨平台的对象关系映射(ORM)框架。作为.NET开发者必备的数据访问技术,它极大地简化了应用程序与数据库的交互过程。本文将带你从零开始,使用EF Core构建一个Pizza配送系统的数据库模型。

环境准备

在开始之前,你需要准备以下环境:

  • .NET 6 SDK
  • Visual Studio或VS Code(可选)
  • SQL Server或SQLite数据库

项目初始化

首先创建一个新的.NET 6控制台应用程序。然后通过NuGet添加以下EF Core相关包:

  1. Microsoft.EntityFrameworkCore.SqlServer - SQL Server数据库提供程序
  2. Microsoft.EntityFrameworkCore.Design - 设计时工具支持
  3. Microsoft.EntityFrameworkCore.Tools - EF Core工具集

实体模型设计

我们将为ContosoPizza披萨配送网站设计数据库模型,主要包含以下实体:

1. Product实体

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; } = null!;
    [Precision(6, 2)]
    public decimal Price { get; set; }
}

关键点说明:

  • Id属性默认被识别为主键(Primary Key)
  • 使用null!初始化非空字符串属性,避免编译器警告
  • [Precision]特性指定Price字段的精度和小数位数

2. Customer实体

public class Customer
{
    public int Id { get; set; }
    public string FirstName { get; set; } = null!;
    public string LastName { get; set; } = null!;
    public string? Address { get; set; }
    public string? Phone { get; set; }
    public string? Email { get; set; }
    public ICollection<Order> Orders { get; set; } = null!;
}

关键点说明:

  • 非空属性(如FirstName)与可空属性(如Address)的声明方式
  • Orders导航属性表示一对多关系

3. Order实体

public class Order
{
    public int Id { get; set; }
    public DateTime OrderPlaced { get; set; }
    public DateTime? OrderFulfilled { get; set; }
    public int CustomerId { get; set; }
    public Customer Customer { get; set; } = null!;
    public ICollection<OrderDetail> OrderDetails { get; set; } = null!;
}

关键点说明:

  • OrderFulfilled为可空类型,表示订单可能未完成
  • 显式声明外键CustomerId(可选)

4. OrderDetail实体

public class OrderDetail
{
    public int Id { get; set; }
    public int Quantity { get; set; }
    public int ProductId { get; set; }
    public Product Product { get; set; } = null!;
    public int OrderId { get; set; }
    public Order Order { get; set; } = null!;
}

关键点说明:

  • 作为中间表实现多对多关系
  • 同时关联Product和Order

创建DbContext

DbContext是EF Core的核心类,代表与数据库的会话:

public class ContosoPizzaContext : DbContext
{
    public DbSet<Product> Products { get; set; } = null!;
    public DbSet<Customer> Customers { get; set; } = null!;
    public DbSet<Order> Orders { get; set; } = null!;
    public DbSet<OrderDetail> OrderDetails { get; set; } = null!;

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("YourConnectionString");
    }
}

注意:实际项目中应将连接字符串存储在安全位置(如环境变量或密钥管理器),而非硬编码。

数据库迁移

EF Core迁移功能允许我们通过代码管理数据库架构变更:

  1. 创建初始迁移:

    Add-Migration InitialCreate
    

    或使用.NET CLI:

    dotnet ef migrations add InitialCreate
    
  2. 检查生成的迁移文件,确保符合预期

  3. 应用迁移到数据库:

    Update-Database
    

    或使用.NET CLI:

    dotnet ef database update
    

数据操作

添加数据

using var context = new ContosoPizzaContext();

var veggieSpecial = new Product 
{
    Name = "Veggie Special Pizza",
    Price = 9.99M
};
context.Products.Add(veggieSpecial);

var deluxeMeat = new Product 
{
    Name = "Deluxe Meat Pizza",
    Price = 12.99M
};
context.Add(deluxeMeat);

context.SaveChanges();

查询数据

使用Fluent API:

var products = context.Products
    .Where(p => p.Price > 10)
    .OrderBy(p => p.Name)
    .ToList();

或使用LINQ语法:

var products = (from product in context.Products
               where product.Price > 10
               orderby product.Name
               select product).ToList();

更新数据

var veggieSpecial = context.Products
    .FirstOrDefault(p => p.Name == "Veggie Special Pizza");

if (veggieSpecial is Product)
{
    veggieSpecial.Price = 10.99M;
    context.SaveChanges();
}

删除数据

var veggieSpecial = context.Products
    .FirstOrDefault(p => p.Name == "Veggie Special Pizza");

if (veggieSpecial is Product)
{
    context.Remove(veggieSpecial);
    context.SaveChanges();
}

总结

通过本教程,我们学习了:

  1. 如何设计EF Core实体模型
  2. 配置DbContext和数据库连接
  3. 使用迁移功能管理数据库架构
  4. 基本的CRUD操作

EF Core的强大之处在于它允许开发者以面向对象的方式操作数据库,而无需编写大量SQL语句。在下一部分,我们将学习如何从现有数据库反向工程生成实体模型。

希望这篇教程能帮助你快速上手EF Core!在实际开发中,记得考虑性能优化、事务管理和并发控制等高级主题。

登录后查看全文
热门项目推荐