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

     2023-04-12     19

关键词:

【中文标题】如何使用 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);
        

【讨论】:

如何禁用 Microsoft.EntityFrameworkCore 中的约定?

】如何禁用Microsoft.EntityFrameworkCore中的约定?【英文标题】:HowtodisableconventionsinMicrosoft.EntityFrameworkCore?【发布时间】:2017-09-1712:49:52【问题描述】:我正在将SQLite与EFCore一起使用,但我遇到了一个问题……如何禁用Pluralize之类的... 查看详情

使用entityframeworkcore时,通过代码自动进行migration

一介绍  在使用EntityFrameworkCore(下面就叫EFCore吧)进行开发时,如果模型有变动,我们要在用EFCore提供的命令行工具进行手工迁移,然后再运行程序。但是为了效率,我想能不能在程序的入口处进行Migration呢?从个人经验来说应... 查看详情

在.netcore中如何让entityframeworkcore在日志中记录由linq生成的sql语句

...#xff0c;另一种方式是使用EFCore提供的日志。在ASP.NETCore使用EntityFrameworkCore的日志.早在EntityFrameworkCore1.0,使用相关的ILoggerProviderILogger这些基础接口类.来实现过日志记录.在EntityFrameworkCore2.0 估计是为了配合ASP.NETCore的日志.所以对这... 查看详情

第15章使用entityframeworkcore进行配置和操作数据i(代码片段)

...存储机制。本快速入门展示了如何配置IdentityServer以使用EntityFrameworkCore(EF)作为此数据的存储机制(而不是使用我们迄今为止使用的内存中实现)。注意除了手动配置EF支持外,还有一个IdentityServer模板可用于创建具有EF支持的... 查看详情

如何清除 dotnet-ef 错误文件未找到 <project>EntityFrameworkCore.targets

】如何清除dotnet-ef错误文件未找到<project>EntityFrameworkCore.targets【英文标题】:Howtocleardotnet-eferrorfilenotfound<project>EntityFrameworkCore.targets【发布时间】:2022-01-0804:04:30【问题描述】:我已使用EntityFramework6.0.0将ASP.NETCoreEnti 查看详情

使用数据库优先方法时如何更新模型

...【发布时间】:2016-12-0823:02:33【问题描述】:我首先使用EntityFrameworkCore数据库创建模型asillustratedintheEFCoredocumentation但我不知道如何在编辑数据库后更新模型。【问题讨论】:它叫EntityFrameworkCore 查看详情

如何使用 Entity Framework Core 进行全文搜索?

】如何使用EntityFrameworkCore进行全文搜索?【英文标题】:HowdoyoudofulltextsearchwithEntityFrameworkCore?【发布时间】:2019-03-1109:23:43【问题描述】:我有以下疑问:SELECTAnimals.nameFROMAnimalsWHERECONTAINS(*,\'felineANDblack\');我无法将其转换为Entity... 查看详情

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

】我应该将啥DbContext与EntityFrameworkCore一起使用?【英文标题】:WhatDbContextshouldIusewithEnityFrameworkCore?我应该将什么DbContext与EntityFrameworkCore一起使用?【发布时间】:2019-04-1205:45:39【问题描述】:我有带有EFCore的.NetCore应用程序。... 查看详情

带有 EntityFrameworkCore 的 ASP.NET Core 中的 SQLite

】带有EntityFrameworkCore的ASP.NETCore中的SQLite【英文标题】:SQLiteinASP.NETCorewithEntityFrameworkCore【发布时间】:2016-07-2901:25:59【问题描述】:如何使用EntityFramework7在ASP.NETCoreWeb应用程序中添加和使用SQLite数据库?当我听说ASP.NETCore并创... 查看详情

使用entityframeworkcore时,通过代码自动migration

使用EntityFrameworkCore时,通过代码自动Migration一介绍  在使用EntityFrameworkCore(下面就叫EFCore吧)进行开发时,如果模型有变动,我们要在用EFCore提供的命令行工具进行手工迁移,然后再运行程序。但是为了效率,我想能不能在程... 查看详情

.net使用一行命令轻松生成efcore项目框架(代码片段)

dotnetef是EntityFrameworkCore(EFCore)的一个命令行工具,用于管理EFCore应用程序的数据库和代码。除了提供管理数据库的命令之外,dotnetef还可以生成和管理实体和上下文代码。本文将介绍如何使用dotnetef动态生成代码。一、环境准... 查看详情

如何使用 Entity Framework Core 正确保存 DateTime?

】如何使用EntityFrameworkCore正确保存DateTime?【英文标题】:HowtocorrectlysaveDateTimeusingEntityFrameworkCore?【发布时间】:2021-02-1310:15:58【问题描述】:我有一个包含DateTime属性的类。如何使用EntityFrameworkCore正确节省时间?下面我举个例... 查看详情

如何使用 Entity Framework Core 模拟异步存储库

】如何使用EntityFrameworkCore模拟异步存储库【英文标题】:HowtomockanasyncrepositorywithEntityFrameworkCore【发布时间】:2017-03-2110:46:36【问题描述】:我正在尝试为调用异步存储库的类创建单元测试。我正在使用ASP.NETCore和EntityFrameworkCore... 查看详情

如何使用 Entity Framework Core 获取主键值

】如何使用EntityFrameworkCore获取主键值【英文标题】:HowtogetprimarykeyvaluewithEntityFrameworkCore【发布时间】:2015-08-2117:24:04【问题描述】:我们目前正在使用下面的方法,它依赖于抽象存储库中的IObjectContextAdapter。从我正在阅读的内... 查看详情

aspnetcore2.0中entityframeworkcore及autofac的使用(附demo)((代码片段)

一,通过Entityframeworkcore中DbFirst模式创建模型这里只说一下Entityframeworkcore中DbFirst模式创建模型,想了解CodeFirst的可以自行度娘,还是在原有项目中创建一个Model类库,然后通过通过vs中NuGet的程序包管理控制台执行 安装EntityFr... 查看详情

Microsoft.EntityFrameworkCore.Tools - 使用 .NET 5(隔离)设计时使用 HostBuilder 创建 DbContext 的 Azure Functions

】Microsoft.EntityFrameworkCore.Tools-使用.NET5(隔离)设计时使用HostBuilder创建DbContext的AzureFunctions【英文标题】:Microsoft.EntityFrameworkCore.Tools-AzureFunctionswith.NET5(Isolated)Design-timeDbContextCreationwithHostBuilder【发布时间】:2021 查看详情

无法使用 Microsoft.EntityFrameworkCore.Cosmos 连接到 Azure Cosmos Db 帐户 - 响应状态代码

】无法使用Microsoft.EntityFrameworkCore.Cosmos连接到AzureCosmosDb帐户-响应状态代码【英文标题】:UnabletoconnecttoAzureCosmosDbAccountusingMicrosoft.EntityFrameworkCore.Cosmos-Responsestatuscode【发布时间】:2020-02-2021:51:19【问题描述】:CosmosDb提供商正在... 查看详情

Entity Framework Core:使用 NOLOCK 读取和选择记录

】EntityFrameworkCore:使用NOLOCK读取和选择记录【英文标题】:EntityFrameworkCore:ReadandSelectRecordsusingNOLOCK【发布时间】:2020-12-1514:24:33【问题描述】:如何使用NOLOCK在EntityFrameworkCore中读取/选择一个?(以避免OLTP数据库中的锁定/阻塞/... 查看详情