記事詳細


投稿日
2026年07月25日18時38分
タイトル

asp.net (10.0ベース)core mvc: 親(category)と子(subcategory),そして,孫(sub2category)のリレーションを想定したmodels/classのコードを教えてください。Navegationプロパティのコード”public subcategory? subcategoryNavigation {get;

内容

ASP.NET Core 10.0(.NET 8ベース)+ Entity Framework Core を想定し、
Category → SubCategory → Sub2Category の 3階層リレーションを持つモデルクラス例を示します。
ご要望の Navigation プロパティ public SubCategory? SubCategoryNavigation { get; set; } も含めます。

モデルクラス例

Csharp
using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace YourApp.Models { // 親カテゴリ public class Category { [Key] public int CategoryId { get; set; } [Required, StringLength(100)] public string CategoryName { get; set; } = string.Empty; // 子カテゴリ(SubCategory)へのナビゲーションプロパティ public ICollection<SubCategory> SubCategories { get; set; } = new List<SubCategory>(); } // 子カテゴリ public class SubCategory { [Key] public int SubCategoryId { get; set; } [Required, StringLength(100)] public string SubCategoryName { get; set; } = string.Empty; // 親カテゴリの外部キー public int CategoryId { get; set; } // 親カテゴリへのナビゲーション public Category? CategoryNavigation { get; set; } // 孫カテゴリ(Sub2Category)へのナビゲーション public ICollection<Sub2Category> Sub2Categories { get; set; } = new List<Sub2Category>(); } // 孫カテゴリ public class Sub2Category { [Key] public int Sub2CategoryId { get; set; } [Required, StringLength(100)] public string Sub2CategoryName { get; set; } = string.Empty; // 子カテゴリの外部キー public int SubCategoryId { get; set; } // 子カテゴリへのナビゲーション(ご要望の形) public SubCategory? SubCategoryNavigation { get; set; } } }

DbContext 設定例

Csharp
using Microsoft.EntityFrameworkCore; using YourApp.Models; namespace YourApp.Data { public class ApplicationDbContext : DbContext { public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } public DbSet<Category> Categories => Set<Category>(); public DbSet<SubCategory> SubCategories => Set<SubCategory>(); public DbSet<Sub2Category> Sub2Categories => Set<Sub2Category>(); protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Category → SubCategory (1:N) modelBuilder.Entity<SubCategory>() .HasOne(sc => sc.CategoryNavigation) .WithMany(c => c.SubCategories) .HasForeignKey(sc => sc.CategoryId) .OnDelete(DeleteBehavior.Cascade); // SubCategory → Sub2Category (1:N) modelBuilder.Entity<Sub2Category>() .HasOne(s2c => s2c.SubCategoryNavigation) .WithMany(sc => sc.Sub2Categories) .HasForeignKey(s2c => s2c.SubCategoryId) .OnDelete(DeleteBehavior.Cascade); } } }

ポイント

  1. Navigation プロパティ
    • 孫カテゴリ Sub2Category
      Csharp
      public SubCategory? SubCategoryNavigation { get; set; }
      を定義し、SubCategoryId 外部キーと関連付けています。
  2. 外部キーとナビゲーションのペア
    • SubCategoryId と SubCategoryNavigation
    • CategoryId と CategoryNavigation
  3. OnModelCreating で明示的にリレーション設定
    • Fluent API を使うことで、削除時の動作(Cascadeなど)も制御可能。
  4. null許容
    • ? を付けることで、関連が存在しない場合も許容。

もしご希望であれば、このモデルを使った サンプルデータのシードコード や コントローラ+ビューのCRUD実装例 も追加できます。
これを作れば、3階層のカテゴリ管理画面をすぐ動かせます。

作成しますか?

Powered by Froala Editor

添付画像

画像はありません
Genreのカテゴリ-名
Models
編集 | 記事一覧