Sql server EF核心-代码优先-多个级联路径

Sql server EF核心-代码优先-多个级联路径,sql-server,entity-framework,foreign-keys,entity-framework-core,cascading-deletes,Sql Server,Entity Framework,Foreign Keys,Entity Framework Core,Cascading Deletes,我知道有很多关于这个主题的文章,所以让我先说,我仔细阅读了上一篇文章的前两页 许多人建议将DeleteBehavior.Restrict,并且dotnet ef数据库更新不再抱怨。问题已解决,直到您尝试删除记录 我有和中完全相同的问题,重复到。第二个环节提出的解决方案是: 你应该打破这个循环。您可以通过关闭 级联删除(通过在 各自的关系配置),用于至少一个 关系客户->付款或客户->计费中心 这就是我目前研究的内容。 现在让我们(再次)来讨论这个问题。我有钻石关系: 所有外键必须不为null。

我知道有很多关于这个主题的文章,所以让我先说,我仔细阅读了上一篇文章的前两页

许多人建议将
DeleteBehavior.Restrict
,并且
dotnet ef数据库更新
不再抱怨。问题已解决,直到您尝试删除记录

我有和中完全相同的问题,重复到。第二个环节提出的解决方案是:

你应该打破这个循环。您可以通过关闭 级联删除(通过在 各自的关系配置),用于至少一个 关系客户->付款或客户->计费中心

这就是我目前研究的内容。
现在让我们(再次)来讨论这个问题。我有钻石关系:

所有外键必须
不为null
。因此,将一个外键设置为允许null不是一个选项。我还希望该用户可以删除:

  • 参数值部件->这里没有问题
  • 参数值->这里没有问题
    OnDelete(DeleteBehavior.Cascade)
  • 参数部分->这里没有问题
    OnDelete(DeleteBehavior.Cascade)
  • 参数->大问题
接下来,我可以使用
OnDelete(DeleteBehavior.Restrict)
打破
参数部分
参数值部分
之间的循环 这将允许我删除
参数
,但现在我无法删除
参数部分

在删除
参数部分之前,我可以手动删除所有
参数值部分
,但我希望避免手动删除。可能吗

我还读到,应用程序中应该避免所有的
级联删除
,开发人员应该在删除行之前手动删除依赖表行。什么是最佳实践?
删除级联似乎是一个简单的解决方案,但我不是在寻找一个简单的解决方案,而是一个正确的解决方案。在大型应用程序的大型数据模型上易于扩展的一个。

我希望我正确理解您的要求

如果您想要一个真正的菱形,则需要
ParameterValueParts
引用
ParameterValues
ParameterParts
来引用相同的
参数。这将由SQL中的复合键建模:

类参数
{
公共int参数id{get;set;}
}
类参数值
{
//ParameterId的复合键,ParameterId也是外键的ValueId
公共int参数id{get;set;}
public int ValueId{get;set;}
}
类参数部分
{
//ParameterId的复合键,PartId中ParameterId也是外键
公共int参数id{get;set;}
公共int PartId{get;set;}
}
类参数ValueParts
{
//钥匙
公共int Id{get;set;}
//三个外键:
//ParameterId作为参数的外键
//ParameterId、ValueId是ParameterValue的复合外键
//ParameterId、PartId是ParameterPart的复合外键
公共int参数id{get;set;}
public int ValueId{get;set;}
公共int PartId{get;set;}
}
这样,您可以有许多
ParameterValue
ParameterPart
的组合,但每个组合都必须属于特定的
参数。有了这个基本的设计,我的项目中从来没有任何级联问题


旁注:您可以在各自的类中将
ValueId
PartId
配置为
DatabaseGeneratedOption.Identity
,以避免手动处理ID值。(至少在EF6中,我希望EF Core在这方面也能起到类似的作用)

真正的钻石关系不会在简单的ID密钥上起作用,但据我记忆所及,它们会带有一些共享密钥部分。。。