ASP.NET Core 10.0(.NET 8ベース)+ Entity Framework Core を想定し、
Category → SubCategory → Sub2Category の 3階層リレーションを持つモデルクラス例を示します。
ご要望の Navigation プロパティ public SubCategory? SubCategoryNavigation { get; set; } も含めます。
モデルクラス例
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 設定例
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);
}
}
}
ポイント
- Navigation プロパティ
- 外部キーとナビゲーションのペア
SubCategoryId と SubCategoryNavigationCategoryId と CategoryNavigation
OnModelCreating で明示的にリレーション設定- Fluent API を使うことで、削除時の動作(Cascadeなど)も制御可能。
- null許容
もしご希望であれば、このモデルを使った サンプルデータのシードコード や コントローラ+ビューのCRUD実装例 も追加できます。
これを作れば、3階層のカテゴリ管理画面をすぐ動かせます。
作成しますか?
Powered by Froala Editor