You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:06:26