如何使用 EntityFrameworkCore 定义父/子关系?

Posted

技术标签:

【中文标题】如何使用 EntityFrameworkCore 定义父/子关系?【英文标题】:How to define parent/children relation with EntityFrameworkCore? 【发布时间】:2021-12-12 02:42:12 【问题描述】:

我有一个项目使用EntityFrameworkCore 来访问数据库中的数据。

我正在尝试为单个对象(即Category)创建父/子关系。我的对象看起来像这样

public class Category

    public int Id  get; set;

    public string Name  get; set; 

    public int? ParentCategoryId  get; set; 

    public Category ParentCategory  get; set; 

    public ICollection<Category> Children  get; set; 

属性ParentCategoryId 是可选的,但设置后,它将确定当前类别的父级。同时,当包含Children关系时,我希望能够拉取ParentCategoryId等于当前类别id的所有类别。

我在上下文中添加了以下代码来定义关系

protected override void OnModelCreating(ModelBuilder builder)

    base.OnModelCreating(builder);
    builder.Entity<Category>(cat =>
    
        cat.HasMany(x => x.Children).WithOne().HasForeignKey(x => x.ParentCategoryId);
        cat.HasOne(x => x.ParentCategory).WithOne();
    );

因此,当调用以下代码时,我想获取类别 id 为 10 的 ParentCategory 和所有 Children

var category = _context.Categories.Where(cat => cat.Id == 10)
                       .Include(x => x.ParentCategory)
                       .Include(x => x.Children)
                       .ToList();

但是,上面的代码给了我以下错误

Invalid column name 'ParentCategoryId1'." string

如何正确定义ParentCategoryChildren 的关系?

【问题讨论】:

【参考方案1】:

您必须为导航属性使用更简单的名称,否则 EF 会感到困惑。此代码已经过测试并且可以正常工作

public class Category
    
        public int Id  get; set; 
        public string Name  get; set; 

        public int? ParentId  get; set; 
        public virtual Category Parent  get; set; 

        public virtual ICollection<Category> Children  get; set; 

     

和数据库上下文

       public virtual DbSet<Category> Categories  get; set; 

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        

            modelBuilder.Entity<Category>()
            .HasOne(s => s.Parent)
            .WithMany(m => m.Children)
            .HasForeignKey(e => e.ParentId);

            OnModelCreatingPartial(modelBuilder);
        

【讨论】:

以上是关于如何使用 EntityFrameworkCore 定义父/子关系?的主要内容,如果未能解决你的问题,请参考以下文章

EntityFrameworkCore上下文如何实现继承?

带有 EntityFrameworkCore 的 ASP.NET Core 中的 SQLite

我应该将啥 DbContext 与 EntityFrameworkCore 一起使用?

Aspnetcore2.0中Entityframeworkcore及Autofac的使用(附Demo)(

Entity Framework Core: `SqlNullValueException: Data is Null.` 如何排查?

Entity Framework Core:如何将 2 个 COUNT 查询合并为一个