Entity Framework Core、DELETE CASCADE 和 [必需]

2023-11-26

我在 Entity Framework Core 中遇到了 DELETE CASCADE 问题,我似乎找不到好的解决方案。

这是我的模型的超级简化版本:

User {UserID, Name}
Recipe {RecipeID, UserID}
Ingredient {IngredientID, UserID}
RecipeIngredient {RecipeID, IngredientID} *RecipeIngredient is the many-to-many table.

Recipe 和 Ingredient 的 UserID 都标记为 [Required],RecipeIngredient 的 RecipeID 和 IngredientID 标记为 [Required]。

问题是 SQL 不会创建数据库,因为有多个到 RecipeIngredient 的级联删除路径(“引入 FOREIGN KEY 约束...可能会导致循环或多个级联路径”)。

所以我陷入了困境......我已经想出了一些想法,但没有任何效果。

  1. 这里有设计解决方案吗?我想保留我的外键,因为强制执行它是有意义的,但如果有设计解决方案,我对此持开放态度。

  2. 我的下一个想法是删除所有指向用户的 FK - 我必须通过 C# 代码在 DELETE 期间强制执行引用完整性,并且我可以使用 [Required] 在 CREATE 期间强制输入数据。问题是 - [必需] 创建一个 FK,并添加“ON DELETE CASCADE”,这使我们又回到了多重级联删除路径问题。我真的很想保留[必需],因为与 Razor 页面、客户端验证和错误等的巧妙集成。

  3. 下一个想法,在 OnModelCreating(...) 中将级联行为设置为 SetNull:

    modelBuilder.Entity()。 HasOne(i => i.User) .WithMany(u => u.Ingredients) .OnDelete(DeleteBehavior.SetNull);

    modelBuilder.Entity() .HasOne(r => r.Source) .WithMany(s => s.Recipes) .OnDelete(DeleteBehavior.SetNull);

但这会引发异常,因为即使我在 Ingredient 和 Recipe 中的属性设置为 Nullable:

[Required(ErrorMessage = "User ID is required.")] 
public Nullable<int> UserID { get; set; }

...由于 [Required] 属性,EF 仍将其创建为 NOT NULL 数据库列。

对此有什么解决办法呢?据我所知,我应该删除 User 的所有 FK,并尝试将其强制作为 CREATE 上的必填字段,但我没有找到使用数据注释来做到这一点的方法,而我想这样做将这个逻辑保留在我的代码优先模型中。


我建议禁用级联删除,因为通常开发人员希望非常小心删除哪些数据,并且禁用级联删除将使您能够对删除方面的数据进行更细粒度的控制。

您可以在OnModelCreation(DbModelBuilder modelBuilder)在您的Context.cs class:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  base.OnModelCreating(modelBuilder);

  modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
  modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();
}

在 EF Core 中,Conventions类不可用,因此您需要迭代实体类型并限制删除以达到所需的效果:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
  base.OnModelCreating(modelBuilder);

  foreach (var relationship in builder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
  {
        relationship.DeleteBehavior = DeleteBehavior.Restrict;
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Entity Framework Core、DELETE CASCADE 和 [必需] 的相关文章

  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • 如何在类文件中使用 Url.Action() ?

    如何在 MVC 项目的类文件中使用 Url Action Like namespace 3harf public class myFunction public static void CheckUserAdminPanelPermissi
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 当事件button.click发生时,如何获取按钮名称/标签?

    我以编程方式制作按钮并将它们添加到堆栈面板中 以便每次用户导航到页面时按钮都会发生变化 我正在尝试做这样的事情 当我单击创建的按钮时 它将获取按钮的标签并转到正确的页面 但是 我无法使用 RoutedEventHandler 访问按钮元素
  • 返回视图作为 JSON 对象的一部分

    我有一个应用程序只加载一次完整视图 我这样做的原因并不重要 重要的是 其余内容只会以部分视图的形式返回 除了一些内容之外 我还有一些 JSON 对象 我想通过每个 AJAX 请求在服务器之间来回传递 有没有办法返回一个 JSON 对象 并将
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • MVC Html.Partial 或 Html.Action

    我是 ASP NET MVC 新手 所以请耐心等待 我需要构建一个在多个视图中重复的菜单 什么可以更好地服务于目的Html Action http msdn microsoft com en us library ee703423 aspx
  • 在 C# 中检查 PowerShell 执行策略的最佳方法是什么?

    当你跑步时Get ExecutionPolicy在 PowerShell 中 它得到有效的执行政策 https learn microsoft com en us powershell module microsoft powershell
  • 在 VS 中运行时如何查看 C# 控制台程序的输出?

    我刚刚编写了一个名为 helloworld 的聪明程序 它是一个 C NET 4 5 控制台应用程序 在扭曲的嵌套逻辑迷宫深处 使用了 Console WriteLine 当我在命令行运行它时 它会运行并且我会看到输出 我可以执行其他命令并
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 模板类的模板构造函数的 C++ 显式模板特化

    我有一个像这样的课程 template
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • C++:为什么 numeric_limits 对它不知道的类型起作用?

    我创建了自己的类型 没有任何比较器 也没有专门化std numeric limits 尽管如此 由于某种原因 std numeric limits
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 是否允许全局静态标识符以单个 _ 开头?

    换句话说 可能static 文件范围 全局变量恰好以一个下划线开头 而不会产生与 C 实现发生名称冲突的可能性 https www gnu org software libc manual html node Reserved Names

随机推荐

  • 清除通知徽章而不删除通知

    在我的应用程序中 我收到徽章编号设置为 1 的推送通知 当应用程序启动时 它应该将徽章计数设置为 0 所以我使用 UIApplication sharedApplication setApplicationIconBadgeNumber 0
  • 如何检查某物是否是拉斐尔物品?

    给定一个 JavaScript 对象 我如何检查它是否是 Raphael 对象 不是纸张 而是圆 路径等 Raphael el代表通用元素原型 我想我想测试一下 x proto Raphael el 以跨浏览器的方式 但我不完全确定 详细说
  • 将未知类型的元素输入向量

    我正在开发一个程序 该程序从用户那里获取元素并对它们进行排序 对于这个程序 我必须使用向量 因为元素列表的大小在用户输入之前是未知的 我们的指示是 用C 编写一个程序来实现元素列表的排序 元素可以是任何类型 但都属于相同类型 就像所有元素一
  • 将 Rails 应用程序更改为生产环境

    如何更改我的 Rails 应用程序以在生产模式下运行 是否有一个配置文件 例如environment rb 可以做到这一点 现在这将是 rails server e production 或者 更紧凑 rails s e productio
  • 如何使用reactjs添加外部javascript文件

    我有一个外部JS file script js function Mega Menu toggle icon on click function if this hasClass active this removeClass active
  • 使用正则表达式拆分简单的 JSON 结构

    我以前从未使用过正则表达式 我希望拆分一个包含一个或多个 JSON 对象的文件 这些 JSON 对象不以逗号分隔 所以我需要将它们分成 并保留两个大括号 该字符串如下所示 id 123 name myName id 456 name ano
  • VBA:声明新对象的两种方式有何不同? (试图理解为什么我的解决方案有效)

    我在循环中创建一个新对象 并将该对象添加到集合中 但是当我读回集合之后 它总是完全被我添加的最后一个对象填满 我想出了两种方法来解决这个问题 但我根本不明白为什么我最初的实现是错误的 原来的 Dim oItem As Variant Dim
  • WordPress:通过ajax调用插件php文件

    我写了一个 WordPress 插件 在我的模板中添加了一些评论功能 通过ajax 所有内容都应该传输到wordpress 数据库中 问题是 ajax 处理程序需要一个 php 文件来捕获查询 if isset POST name POST
  • 具有特定位置的 MKMapItem

    如何启动 iOS6 的默认地图应用程序并向其传递自定义位置 例如 MKMapItem setLocation MyLocation openInMapsWithLaunchOptions nil 我按照这里的例子 但无法弄清楚 如何从我自己
  • Android:卸载时从外部存储中删除应用程序关联的文件?

    如果我正在编写的应用程序将一些文件永久存储到外部存储 因此它们在应用程序退出 销毁 后仍然存在 那会很方便 但是在卸载时我想做一些体面的事情并拥有这些文件删除文件以释放存储空间 有什么方法可以在卸载时删除这些文件吗 如果没有 我对此表示怀疑
  • 检查数据表中是否有空值的最佳方法

    检查数据表中是否有空值的最佳方法是什么 在我们的场景中 大多数情况下 一列将全部包含空值 此数据表由第三方应用程序返回 我们试图在应用程序处理数据表之前进行验证 尝试将列的值与DBNull Valuevalue 以您认为合适的方式过滤和管理
  • NodeRT:找不到程序集

    我正在写一个electron应用程序与电子窗口通知这取决于NodeRT 当我尝试安装我的项目时 每个项目都会出现以下错误 nodert win10依赖项 gt if not defined npm config node gyp node
  • IOS 11 Beta 上的 cordova 的 html-select 下拉问题

    我目前使用 AngularJS 和 Cordova 构建一个 IOS 应用程序 当我在 IOS 11 Beta 上尝试我的应用程序时 我发现了一个错误 要选择表单中的某些数据 我们使用 select dropDown 当我们选择一个值时 下
  • Docker,无法使用 docker flag -p 3000:3000 从 localhost:3000 访问“rails 服务器”开发

    我正在尝试将 docker 与 Rails 结合使用 在一个容器内构建整个堆栈 我的最终目标是拥有一个 nginx memcached unicorn rails postgres 堆栈 并以 runit 作为进程管理器 到目前为止 我已经
  • 如何将 std::chrono::time_point 转换为带有小数秒的日历日期时间字符串?

    如何转换std chrono time point带有小数秒的日历日期时间字符串 例如 10 10 2012 12 38 40 123456 如system clock 该类有time t转换 include
  • 获取网格中的绝对行号

    在yii的网格视图我可以通过使用获取当前行号 row 但这仅返回当前页面内的行索引 我真正需要的是获取所有页面中的绝对行号 我正在使用 yii 所以我的梦想应该 轻松 实现 所以我希望答案不应该引导我向数据提供程序添加特殊字段或访问寻呼机并
  • 将用户标头搜索路径添加到 podspec

    这是这个问题的后续 CocoaPods 可能有一个包含主应用程序的搜索路径 我想添加 添加一个User Header Search Path到我的 podspec 以便在编译时添加它 但我不知道如何执行此操作 其效果如下 将此代码添加到您的
  • javascript Replace() 没有替换所有匹配的字符

    我想转 管理员 电影列表 into Admin 电影列表 using 代替 var id id replace 看起来它只替换了第一个 我如何替换所有这些 谢谢你的帮助 Use a regex with the g flag var id
  • 使用 XmlTextReader

    我是一名初级程序员 从 C 和 Web 服务开始 In the Service cs我的网络服务文件 我创建一个ReadXMLFile 方法 我尝试读取现有的 XML 文件 从中获取数据并将其放置到我在IService cs file 我的
  • Entity Framework Core、DELETE CASCADE 和 [必需]

    我在 Entity Framework Core 中遇到了 DELETE CASCADE 问题 我似乎找不到好的解决方案 这是我的模型的超级简化版本 User UserID Name Recipe RecipeID UserID Ingre