Entity Framework 4.1 Codefirst:删除一对多子项时出现“给定多重约束”错误

2023-11-22

我有以下课程实体框架4.1(这些类已被修剪以保持代码的可读性)

public class MetaInformation
{
    public int Id { get; set; }
    public virtual MetaInformationObject RelatedTo { get; set; }
}

public abstract class MetaInformationObject
{
    public int Id { get; set; }
    public virtual List<MetaInformation> MetaInformations { get; set; }
}

[Table("Hardwares")]
public class Hardware : MetaInformationObject
{
    [MaxLength(100)]
    public string Name { get; set; }
}

public class Inventory
{
    public int Id { get; set; }
    public virtual List<Machine> Machines { get; set; }
}

public class Machine : Hardware
{
    public Inventory Inventory { get; set; }
}

 protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Isis.Business.Base.MetaInformationObject>()
        .HasMany<Isis.Business.Base.MetaInformation>(mi => mi.MetaInformations).WithRequired(mi => mi.RelatedTo).WillCascadeOnDelete(true);
    modelBuilder.Entity<Isis.Business.Inventory.Inventory>()
            .HasMany<Isis.Business.Inventory.Machine>(i => i.Machines).WithRequired(m => m.Inventory).WillCascadeOnDelete(true);

    base.OnModelCreating(modelBuilder);
}

在某一时刻,我想更新一台机器信息,所以如果它已经存在于数据库中,我会加载它,附加它,然后清除以前的元信息以用新的元信息替换它们。

public void UpdateMachine(Inventory i, Machine m)
{
    DataContext.Dao.Db.Inventories.Attach(i);
    if (!i.Machines.Exists(InnerHardware => InnerHardware.SerialNumber == m.SerialNumber)) {
        i.Machines.Add(m);
    } else {
        var workingMachine = i.Machines.First(Machine => Machine.SerialNumber == m.SerialNumber);
        Dao.Db.Machines.Attach(workingMachine);
        if (workingMachine.MetaInformations != null && workingMachine.MetaInformations.Count > 0) {
            workingMachine.MetaInformations.Clear();
            //workingMachine.MetaInformations.ForEach(mi => { Dao.Db.MetaInformations.Attach(mi); Dao.Db.MetaInformations.Remove(mi); }); // tried this to, with variations
        }
        workingMachine.MetaInformations = m.MetaInformations;
    }
    DataContext.Dao.Db.SaveChanges();
}

然后,抛出以下 DbUpdateException:

来自“MetaInformationObject_MetaInformations”的关系 AssociationSet 处于“已删除”状态。给定多重性 约束,相应的 “MetaInformationObject_MetaInformations_Target”也必须在 “已删除”状态。

我尝试按照这里的一些问题来解决问题,特别是尝试阅读this one and the link答案中提供(这就是为什么直接引用MetaInformation to MetaInformationObject)但我不知道出了什么问题。


级联删除在这里对你没有帮助。仅当删除父实体(MetaInformationObject)。这里的问题是,对相关对象的集合调用 Clear 不会删除它们。它仅删除关系(=它将在中设置外键MetaInformation为 null),但您的映射约束不允许(您根据需要定义了关系)。避免这种情况的方法是:

  • 遍历所有相关的MetaInformations 并删除它们中的每一个
  • 重构模型来定义识别关系。在那之后Clear不仅会破坏关系,还会将相关实体标记为已删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Entity Framework 4.1 Codefirst:删除一对多子项时出现“给定多重约束”错误 的相关文章

随机推荐

  • 如何应用 git format-patch 生成的补丁?

    我有两个本地 git 存储库 都指向same远程存储库 在一个 git 存储库中 如果我这样做git format patch 1 如何将该补丁应用到其他存储库 注意 您可以先预览您的补丁将执行的操作 首先是统计数据 git apply s
  • 如何在Android应用程序中隐藏导航栏?

    我想知道如何在 Android 应用程序中隐藏导航栏 我一开始知道如何隐藏它 但是一旦我触摸屏幕 它就会弹出 我想隐藏它 就像 部落冲突 等游戏隐藏它一样 使其弹出的唯一方法是向下滑动通知或滑动导航栏应该在的位置 使用沉浸式模式检查这个沉浸
  • 在 WPF 中使用图像和图标

    我试图在 WPF 应用程序中使用图标 并使用一些图像来处理其他事情 但我不断从设计器视图中收到错误 提示诸如 path x 不是有效资源或无法找到 之类的内容 其中 path x 是我尝试使用的任何图像的路径 如果它在正确的地方寻找 我打赌
  • 视图未附加到窗口管理器崩溃

    我正在使用 ACRA 来报告应用程序崩溃 我正在得到一个View not attached to window manager错误消息并认为我已经通过包装来修复它pDialog dismiss 在 if 语句中 if pDialog nul
  • Python - 连接多个线程并设置超时

    我有多个进程线程正在运行 我想加入all它们与超时参数一起 我知道如果不需要超时 我可以写 for thread in threads thread join 我想到的一个解决方案是使用一个主线程将所有线程连接在一起并尝试连接该线程 但是
  • Linux内核.mod.c文件中版本信息的含义

    在所有可加载内核模块中 当make给出它会生成一个名为的文件modulename mod c此外modulename ko 以下代码摘录自 mod c文件 其中包含一个 number function 一对 这个数字有什么意义呢 这个数字是
  • AC账户存储错误5

    当尝试将帐户保存到 ACAccountStore 时 我有时会收到此错误 稍后 如果我尝试访问该帐户 我发现它实际上已被保存 到目前为止 我还没有找到有关这个不起眼的错误的任何信息 有谁知道这意味着什么 错误域 com apple acco
  • Azure - 通知中心命名空间错误

    Im trying to set up push notifications with Azure at the moment but every time i go and try to set up a notification hub
  • 抑制 JSP 文件中的 Java 未检查警告

    我有一个旧版 Web 应用程序 它使用 jstl 和 Struts 1 标签 当我使用 Java 5 6 预编译 JSP 文件时 jstl 和 Struts 1 标记会抛出有关 未经检查或不安全操作 的警告 例如 如果我使用以下标签 抛出以
  • Python MysqlDB 使用cursor.rowcount 和 SSDictCursor 返回错误的计数

    我有以下代码 cur db cursor cursors SSDictCursor cur execute SELECT FROM large table result count cur rowcount print result cou
  • CSS:如何使水平列表居中?显示:内嵌不工作

    我在让最简单的代码工作时遇到了很大的困难 我希望我的 css 水平列表居中 仅此而已 链接在这里 http bit ly LtIBai 我有这个代码 megaMenu megaMenuHorizontal ul megaMenu text
  • OS X / Linux:通过管道连接到两个进程?

    我知道关于 program1 program2 and program1 tee outputfile program2 但是有没有办法将程序的输出同时输入到程序和程序 3 中呢 你可以这样做tee和流程替代 program1 tee gt
  • PSQLException:此 ResultSet 已关闭

    我一生中第一次出现这种奇怪的错误 我不知道这意味着什么 我有一个类 它从 postgresql 数据库上的表中检索信息 执行一些操作并返回带有解析元素的数组列表 ResultSet rs ProduttoreDCS getProduttor
  • 选择中的 LINQ 选择

    我正在尝试查询包含以下内容的集合Employee信息 当我查询该集合时 我想返回对象的枚举 其中每个对象都有两个字段 Name 经理姓名 请注意 每个经理也是员工 现在 这是我遇到的问题 当我做一个select在一个select 的值Man
  • f.seek() 和 f.tell() 读取文本文件的每一行

    我想打开一个文件并使用读取每一行f seek and f tell 测试 txt abc def ghi jkl 我的代码是 f open test txt r last pos f tell get to know the current
  • Outlook 回复或回复全部电子邮件

    Set objOutlook CreateObject Outlook Application Set objMail objOutlook CreateItem 0 objMail To email protected objMail c
  • 如何使参数推导适用于使用基类构造函数的派生类?

    当派生类使用基类构造函数时 推论似乎总是fail 然而 当基类有很多构造函数时 重新定义所有构造函数是非常笨拙的 当基类快速演变为新的构造函数时 这也是一个痛苦 老问题是两年多前提出的 所以我想知道 在 2020 年 c 17 和 c 2a
  • qDebug Qt 控制台应用程序输出到 Qt Creator 应用程序输出

    如何在 Qt 控制台应用程序中使用 qDebug 输出到 Qt Creator 应用程序输出 窗口 当前 qDebug 写入控制台窗口 这会干扰非调试输出 默认情况下 在 Qt GUI 应用程序中使用 qDebug 会输出到应用程序输出窗口
  • 在 ARKit 中获取设备绕世界原点 y 轴的旋转

    当我在 ARKit 中绕 y 轴旋转设备时 我试图计算设备的旋转 为了澄清起见 ARKit 中的 y 轴是垂直于地面指向上方的轴 我使用 eulerangles 来获得相机的旋转 如下所示 var alpha sceneView point
  • Entity Framework 4.1 Codefirst:删除一对多子项时出现“给定多重约束”错误

    我有以下课程实体框架4 1 这些类已被修剪以保持代码的可读性 public class MetaInformation public int Id get set public virtual MetaInformationObject R