自引用实体循环依赖仅发生在 EF Core 6.0 上

2024-01-03

描述

我认为这是一个 EF Core 6.0 错误,但我想在向 EF Core GitHub 存储库提交错误之前检查此处。

我完全不确定这是否是一个错误。至少我认为这是一种意想不到的行为。

在迁移到 .NET 6 后,此行为首次出现。我已成功在由下面所示的 3 个文件组成的简单项目中重现该问题。首先,我认为这是一个重大变化,所以我回顾了所有这些。但是,我无法找到任何会导致此错误的重大更改。由于我无法将错误与任何更改联系起来,因此我开始更改我的 EF Core 版本.csproj文件。一旦我将所有包(EF Core)更改为 6.0.0-rc.2.21480.5,错误就不会再出现。

另一件要强调的事情是,如果我添加一个SaveChanges删除program.cs 文件后,该错误也不会发生。

您认为这是一个错误还是我错过了新功能或重大更改?

Person.cs:

#nullable disable
public class Person
{
    public int PersonId { get; set; }
    public string Name { get; set; }
    public int? ParentId { get; set; }
    public Person Parent { get; set; }

    protected Person()
    {
    }
    
    public Person(string name, Person parent)
    {
        this.Name = name;

        if (parent is not null)
        {
            this.Parent = parent;
        }
    }
}

Context.cs:

#nullable disable
using Microsoft.EntityFrameworkCore;

public class Context : DbContext
{
    public Context()
    {}

    public DbSet<Person> Parents { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(
            "Data Source=DES04;Initial Catalog=Test;Integrated Security=true");        
        base.OnConfiguring(optionsBuilder);
    }
    
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .HasOne(p => p.Parent)
            .WithMany()
            .IsRequired(false)
            .OnDelete(DeleteBehavior.Restrict);

        modelBuilder.Entity<Person>()
            .HasKey(p => p.PersonId);
    }
}

Program.cs:

var context = new Context();

var parent = new Person("1", null);
var child1 = new Person("2", parent);
var child2 = new Person("3", parent);
var grandchild1 = new Person("4", child1);
var grandchild2 = new Person("5", child1);
var grandchild3 = new Person("6", child2);
var grandchild4 = new Person("7", child2);

context.Add(parent);
context.Add(child1);
context.Add(child2);
context.Add(grandchild1);
context.Add(grandchild2);
context.Add(grandchild3);
context.Add(grandchild4);
context.SaveChanges();

context.Remove(parent);
context.Remove(child1);
context.Remove(child2);
context.Remove(grandchild1);
context.Remove(grandchild2);
context.Remove(grandchild3);
context.Remove(grandchild4);

parent = new Person("1", null);
child1 = new Person("2", parent);
child2 = new Person("3", parent);
grandchild1 = new Person("4", child1);
grandchild2 = new Person("5", child1);
grandchild3 = new Person("6", child2);
grandchild4 = new Person("7", child2);

context.Add(parent);
context.Add(child1);
context.Add(child2);
context.Add(grandchild1);
context.Add(grandchild2);
context.Add(grandchild3);
context.Add(grandchild4);
context.SaveChanges();

堆栈跟踪:

未处理的异常。 System.InvalidOperationException:无法保存更改,因为在要保存的数据中检测到循环依赖关系:'Person [Deleted]Person [Deleted] Parent { 'ParentId' }

在 Microsoft.EntityFrameworkCore.Utilities.Multigraph2.ThrowCycle(List1个周期,功能2 formatCycle, Func2 格式异常)
在 Microsoft.EntityFrameworkCore.Utilities.Multigraph2.BatchingTopologicalSort(Func4 尝试BreakEdge、Func2 formatCycle) at Microsoft.EntityFrameworkCore.Update.Internal.CommandBatchPreparer.TopologicalSort(IEnumerable1 个命令)
在 Microsoft.EntityFrameworkCore.Update.Internal.CommandBatchPreparer.BatchCommands(IList1 entries, IUpdateAdapter updateAdapter)+MoveNext() at Microsoft.EntityFrameworkCore.Update.Internal.BatchExecutor.Execute(IEnumerable1个commandBatches,IRelationalConnection连接)
在 Microsoft.EntityFrameworkCore.Storage.RelationalDatabase.SaveChanges(IList1 entries) at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(IList1 条待保存)
在Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(StateManager stateManager,布尔acceptAllChangesOnSuccess)
在 Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.c.b__104_0(DbContext _, ValueTuple2 t) at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func3操作,Func`3验证成功)
在Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(布尔acceptAllChangesOnSuccess)
在Microsoft.EntityFrameworkCore.DbContext.SaveChanges(布尔acceptAllChangesOnSuccess)
在 Microsoft.EntityFrameworkCore.DbContext.SaveChanges()
在 C:\Users\Dev04\Desktop\Nueva Carpeta\test\Program.cs 中的 Program.$(String[] args) 处:第 44 行

版本信息

  • EF 核心:Microsoft.EntityFrameworkCore 6.0.0
  • 数据库提供商:Microsoft.EntityFrameworkCore.SqlServer 6.0.0
  • 目标框架:.NET 6.0.0

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

自引用实体循环依赖仅发生在 EF Core 6.0 上 的相关文章

  • 框架中有通用的交换方法吗?

    框架中是否存在这样的方法 public static void Swap
  • 如何创建实体集或模型而不在数据库中创建相应的表 - 实体框架

    我的 sqlserver 数据库中有一个存储过程 它返回多个结果集 我正在使用 msdn 中的以下链接从实体框架中的 SP 读取多个结果集 https msdn microsoft com en us library jj691402 v
  • 如何使用 Linq 将实体表与交叉引用表连接起来

    首先我要说的是 我对 Linq 比较陌生 但我似乎很快就掌握了其中的大部分内容 但这个问题却难倒了我 我找了又找都没有结果 我使用代码优先并创建了 2 个模型 项目 和 关键字 他们之间存在多对多的关系 我的实体模型如下所示 public
  • .NET Framework 2.0 Service Pack 1 中新增的类型

    我以为 NET 2 0 SP1 中只有错误修复 没有新类型 直到我遇到few http davesbox com archive 2008 08 25 new for visual studio 2008 sp1 and fxcop 1 3
  • 有没有办法将对象(及其属性)序列化为 xml?

    创建一个类 将其命名为 FormElement 该类应该具有一些属性 例如它们具有数据元素的元数据 名称 序列号 值 只是一个字符串等 该类具有验证应用程序块验证类类型的属性 我想将其序列化为xml并反序列化 验证类的所有属性 包括验证应用
  • SecurityAction.RequestMinimum 在 .Net 4.0 中已过时

    最近 我们的 Net 客户端库正在升级以针对 Net 4 0 进行编译 将目标框架更改为4 0后 应用程序出现一些编译错误 In AssemblyInfo cs assembly SecurityPermission SecurityAct
  • 如何使用 StreamWriter 写入文件?

    在我的 Wpf 应用程序中 我使用一个 Person 类 即基类 它包含一个虚拟方法 SaveData 以及从 Person 继承的其他类 Client 如何重写方法 SaveData 并保留基础数据 类人 public virtual v
  • TransactionScope 的细微差别

    假设我有两个线程 它们在特定于线程的 TransactionScope 中执行一些面向数据库的代码 并具有 ReadCommissed 隔离级别 但是有一些表的数据应该共享 不应创建重复项 using var transactionScop
  • Global.asax 和 Error.aspx 中的 ASP.NET MVC 错误日志记录

    我正在创建一个 ASP NET MVC 应用程序 我需要在两个地方处理异常 Global asax vb 文件 Public Class MvcApplication Inherits System Web HttpApplication
  • 如何禁用 WebBrowser 控件中的点击声音

    我使用 Javascript 单击网络浏览器控件中的链接 但我不想听到IE的 咔哒 声 有什么办法可以做到这一点吗 P S 我不想更改系统设置 我见过这个 如何仅在您的应用程序中禁用网络浏览器 点击声音 https stackoverflo
  • 如何使用 LibGit2Sharp 从 Git 获取更改?

    下面的代码将 Git url 克隆到测试目录 var url http abc 555 com team project 555 git var path E temp 555 var credential new Credentials
  • 装配和产品版本不匹配

    我正在尝试在 asp net 网站中使用 Ajax 控件工具包 我从之前的一个示例项目中复制了 dll 它有以下详细信息 Assembly Version 3 5 40412 0 File Version 3 5 40412 2 Inter
  • URL 中的点 (.) 字符错误

    当我点击编辑具有此 url 的用户时遇到问题ASP NET MVC 3项目 http domain com 8089 User EditUser username surname IDUser e11a621p df11 4687 9903
  • 在哪里使用 EF6 订阅 ObjectMaterialized?

    我正在尝试将我的上下文订阅到以下 OnjectMaterialized 事件this https stackoverflow com a 3756842 2835713 像这样 IObjectContextAdapter this Obje
  • .NET:SqlDataReader.Close 或 .Dispose 导致超时过期异常

    当尝试在 SqlDataReader 上调用 Close 或 Dispose 时 我收到超时过期异常 如果您有到 SQL Server 的 DbConnection 您可以使用以下命令自行重现它 String CRLF r n String
  • 为什么 .Net 框架指南建议您不要使用 ref/out 参数?

    显然 他们很 混乱 这是认真的原因吗 你还能想到其他的吗 你见过有多少开发人员并不真正理解 ref out 吗 我在真正需要的地方使用它们 但在其他地方则不然 它们通常仅在您想有效返回两个或多个值时才有用 在这种情况下它至少值得thinki
  • Math.Sin、Math.Cos 和 Math.Tan 精度以及正确显示它们的方法

    我正在用 C 编写一个计算器 textBoxResult是一个文本框 我在其中显示数字 recount是以度为单位获取角度并以弧度为单位返回的函数 我的角度是从texBoxInput public double recount int nu
  • 如何将对 System.Data.DataSetExtensions 的引用添加到网站 ascx.cs 文件?

    我们正在处理一个网站项目并尝试参考System Data DataSetExtensions 使用 Web 应用程序会更好 不过 技术主管有她的理由 这是我们尝试过的 找到装配路径 打开 Visual Studio 命令提示符并运行sn e
  • 频繁插入已排序的集合

    我已经对集合 列表 进行了排序 并且我需要始终保持其排序 我目前在我的集合上使用 List BinarySearch 然后在正确的位置插入元素 我也尝试过在每次插入后对列表进行排序 但性能不可接受 有没有一种解决方案可以提供更好的性能 也许
  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然

随机推荐

  • 我如何在cmd行中运行maven项目

    我编写 Maven 项目并在 Eclipse 中运行它 但我想使用命令行运行 Maven 项目 所以我写 java jar Dapple awt UIElement true target myproject 1 0 SNAPSHOT ja
  • 使用curl --data测试REST路由,返回404

    我正在尝试 MEAN 堆栈教程 并且我位于 测试初始路由 https thinkster io mean stack tutorial opening rest routes testing the initial routes 步骤 我们
  • Apache CXF 2.2.7 Spring 3 Web 服务解组错误:意外元素

    我使用 Apache CXF 2 2 7 和 Spring 3 开发了一个简单的 Web 服务应用程序 并将其作为 WAR 文件部署到 Tomcat 上 但收到以下错误消息 2010 年 4 月 12 日 15 56 12 org apac
  • 函数代理 .toString() 错误

    我试图在函数代理上调用 toString 简单地创建一个函数代理并调用 toString 会导致 TypeError Function prototype toString is not generic 将 toString 设置为返回原始
  • 如何取消特定用户的会话?

    我有一个这样的会议 SESSION login 当它等于1 这意味着使用已登录到我的网站 if SESSION login 1 You are logged else login register 我还有另一个包含用户 ID 的会话 像这样
  • Moqui 部署到 Elastic Beanstalk Tomcat 实例上的 AWS

    背景 我们已经使用 Java 环境在 Elastic Beanstalk 上运行带有嵌入式 Jetty 服务器的 Moqui 2 0 大约一年了 出于安全原因 我们让应用程序与 Postgres 数据库一起在私有子网中运行 并通过 VPN
  • Mosquitto套接字读取错误Arduino客户端

    我刚刚从 Github 下载了最新的 Arduino 库代码 它破坏了我的 MQTT 客户端程序 我在 Arduino 上使用 PubSubClient 1 91 在 Mac OSX 上使用 Mosquitto 1 1 2 Build 20
  • data.table 1.8.x Mean() 函数自动删除 NA?

    今天我发现我的程序中存在一个错误 原因是data table自动删除NA for mean 例如 gt a lt data table a c NA NA FALSE FALSE b c 1 1 2 2 gt a gt a list mea
  • 监听短信删除android

    我正在寻找用户从收件箱中删除短信的侦听器 Android 中用于删除短信的任何侦听器 https stackoverflow com questions 5025372 any listener for delete sms in andr
  • 经典 ADO.NET 还在使用吗?

    经典的 ADO NET 是否仍然广泛使用并被许多开发人员用于插入 读取数据等 尽管我们现在有 LINQ 和 EF 是的 在某些情况下仍然使用它 在我的日常工作中 我们有几个使用 SQL 大容量复制的情况 这需要良好的连接和命令 此外 SQL
  • 有没有办法刷新 POSIX 套接字?

    是否有一个标准调用可以将 POSIX 套接字的发送端一直刷新到远程端 或者是否需要将其作为用户级协议的一部分来实现 我查看了常见的标题 但找不到任何东西 设置 TCP NODELAY 然后将其重置回来怎么样 也许可以在发送重要数据之前或完成
  • 使用未知分隔符进行 Unix 排序(最后一列)

    我的数据如下所示 Adelaide Crows 5 2 3 0 450 455 460 67 8 Essendon 5 5 0 0 622 352 955 88 20 Fremantle 5 3 2 0 439 428 598 50 12
  • 使用 ffmpeg 添加不透明度叠加

    我的 ffmpeg 有问题 我尝试在视频上添加 png 文件 我发现如何添加 只是我希望这个 png 文件有一些不透明度 我尝试了这条线 ffmpeg n i video mp4 i logo png filter complex sets
  • 对有连字符的字母数字数据进行排序

    我的工作簿中有两张表 每张表都有自己的电子邮件地址列以及其他数据 我将引用 Sheet1 中的 Column1 和 Sheet2 中的 Column2 其中只有 Column1 可能列出了重复的电子邮件地址 我需要确定 Column1 中的
  • Oracle sql 中“%Type”是什么意思?

    我第一次体验 Oracle 和 TOAD 我知道 SSMS 我在更新过程中的输入参数旁边遇到了这个 Type 但我不知道它是什么或意味着什么 我在 Google 上找到了与 Rowtype 相关的链接 是相同的东西还是完全不同的东西 如果这
  • 在一行中获取 Stream/List 的最后一个元素

    如何在以下代码中获取流或列表的最后一个元素 Where data careas is a List
  • java中的分解,什么时候才够呢?

    我是计算机科学专业一年级的学生 我们目前正在使用 java 进行编程 我经常尝试将程序分解为命名良好的方法 以便我的主方法逻辑可以尽可能接近伪代码地读取 我发现的问题是 我常常最终编写了如此多的小型私有方法 以至于我觉得我可能做得太过了 在
  • 数据建模 3 路表 has_many 关联

    我正在尝试构建一个表来处理某个营销活动已设置为的位置和类别 并具有以下模型关联 class Campaign lt ActiveRecord Base has many campaign category metro bids depend
  • 使用 EL 变量动态地将 ID 分配给标签

    我想循环一些 客人 并动态插入一个id
  • 自引用实体循环依赖仅发生在 EF Core 6.0 上

    描述 我认为这是一个 EF Core 6 0 错误 但我想在向 EF Core GitHub 存储库提交错误之前检查此处 我完全不确定这是否是一个错误 至少我认为这是一种意想不到的行为 在迁移到 NET 6 后 此行为首次出现 我已成功在由