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

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

2025-06-29 01:05:05作者:柯茵沙

前言

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!在实际开发中,记得考虑性能优化、事务管理和并发控制等高级主题。

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

项目优选

收起
kernelkernel
deepin linux kernel
C
23
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
225
2.27 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
9
1
flutter_flutterflutter_flutter
暂无简介
Dart
526
116
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
988
585
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
351
1.42 K
leetcodeleetcode
🔥LeetCode solutions in any programming language | 多种编程语言实现 LeetCode、《剑指 Offer(第 2 版)》、《程序员面试金典(第 6 版)》题解
Java
61
17
GLM-4.6GLM-4.6
GLM-4.6在GLM-4.5基础上全面升级:200K超长上下文窗口支持复杂任务,代码性能大幅提升,前端页面生成更优。推理能力增强且支持工具调用,智能体表现更出色,写作风格更贴合人类偏好。八项公开基准测试显示其全面超越GLM-4.5,比肩DeepSeek-V3.1-Terminus等国内外领先模型。【此简介由AI生成】
Jinja
47
0
giteagitea
喝着茶写代码!最易用的自托管一站式代码托管平台,包含Git托管,代码审查,团队协作,软件包和CI/CD。
Go
17
0
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
JavaScript
212
288