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密钥上起作用,但据我记忆所及,它们会带有一些共享密钥部分。。。