如何在ASP.NET Core 6 Web API中配置表的一对多关联外键
解决ASP.NET Core中Item与Category的一对多关联问题
1. 修正模型类(遵循C#规范并添加导航属性)
调整类名、属性名符合C#命名约定,同时添加EF Core识别关系所需的导航属性:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Collections.Generic; namespace WebApplication1.Models { public class ItemTable { [Key] public int Id { get; set; } public string Company { get; set; } public string Availability { get; set; } public decimal Price { get; set; } public decimal Discount { get; set; } public decimal Tax { get; set; } public string Description { get; set; } // 外键属性,与导航属性匹配 public int CategoryId { get; set; } // 导航属性:每个物品属于一个分类 [ForeignKey(nameof(CategoryId))] public Category Category { get; set; } } // 类名改为单数形式,更符合语义 public class Category { [Key] public int CategoryID { get; set; } public string CategoryName { get; set; } // 导航属性:一个分类可包含多个物品 public ICollection<ItemTable> Items { get; set; } = new List<ItemTable>(); } }
2. 更新DbContext配置
调整DbSet名称,同时用Fluent API明确配置一对多关系(也可依赖EF Core约定自动识别):
using Microsoft.EntityFrameworkCore; using WebApplication1.Models; namespace WebApplication1.Context { public class ItemTableDbContext : DbContext { public ItemTableDbContext(DbContextOptions<ItemTableDbContext> options) : base(options) { } public DbSet<ItemTable> ItemTables { get; set; } public DbSet<Category> Categories { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<ItemTable>().ToTable("itemtable"); modelBuilder.Entity<Category>().ToTable("categories"); // 明确配置一对多关系:分类为主表,物品为从表 modelBuilder.Entity<ItemTable>() .HasOne(i => i.Category) .WithMany(c => c.Items) .HasForeignKey(i => i.CategoryId) .OnDelete(DeleteBehavior.Cascade); // 删除分类时自动删除关联物品,可改为Restrict禁用该行为 } } }
3. 迁移并更新数据库
打开Package Manager Console,执行以下命令更新数据库结构:
Add-Migration AddCategoryItemRelationship Update-Database
4. 示例:创建分类并关联物品
以下代码演示如何创建"electronics"分类,再添加关联的"Apple mobile phone"物品:
using (var context = new ItemTableDbContext(options)) { // 查找或创建electronics分类 var electronicsCategory = context.Categories.FirstOrDefault(c => c.CategoryName == "electronics"); if (electronicsCategory == null) { electronicsCategory = new Category { CategoryName = "electronics" }; context.Categories.Add(electronicsCategory); context.SaveChanges(); } // 创建关联到该分类的物品 var applePhone = new ItemTable { Company = "Apple", Availability = "In Stock", Price = 699.99m, Discount = 0m, Tax = 59.99m, Description = "Apple mobile phone", CategoryId = electronicsCategory.CategoryID // 关联分类ID }; context.ItemTables.Add(applePhone); context.SaveChanges(); }
配置完成后,多个物品可通过同一个CategoryId关联到同一分类,满足需求。
内容的提问来源于stack exchange,提问作者Firefly0027
相关产品推荐
相关产品推荐

