我正在try 使用流畅的API来理解EF Core中的关系.我有使用属性表示法的背景.

有关使用以下各项的指导原则是什么:

IsRequired()OnDelete()

它们是可以互换的,还是相互冲突的?我能使用这些方法中的一种来实现我的目标吗?

据我所知,OnDelete()方法的范围更广,但我是否可以在所有情况下都只使用它而不是IsRequired()

例如:在这里,当我使用SetNull时,我不能在IsRequired()中使用true,但如果我注释掉IsRequired()行,则一切正常:

modelBuilder.Entity<User>()
      .HasOne(b => b.Biography)
      .WithOne(u => u.User)
      .HasForeignKey<Biography>(u => u.UserId)
      .IsRequired(false)
      .OnDelete(DeleteBehavior.SetNull);
  

如果我错了,请举个例子,其中IsRequired()是强制性的,而只有OnDelete()是没有帮助的.

推荐答案

IsRequired()OnDelete()相互影响,但不是严格意义上的interchangable.有7个不同的DeleteBehaviour值,而IsRequired只有2个状态,因此根据传递到IsRequired(bool)的值,默认约定只配置了2个状态.

  • 使用IsRequired()根本不是强制性的,如果省略,则由关联属性的类型的nullability推断.如果属性是nullable,则隐含IsRequired(false),否则隐含IsRequired(true).

如果您的用例与默认约定匹配,那么您根本不需要同时指定IsRequired()OnDelete().您仍然可以 Select 这样做,以明确您的意图,但是添加了约定的概念,这样您就可以在一个地方做出全局决策,并减少代码中对规则的引用,这些规则变得更加难以维护.

那么,这对OnDelete()有什么影响呢?

See DeleteBehaviour
Cascade Automatically deletes dependent entities when the principal is deleted or the relationship to the principal is severed, and creates creates a foreign key constraint in the database with cascading deletes enabled. This is the default for required relationships.

ClientSetNull个 当对跟踪的实体进行更改时,根据需要将外键值设置为NULL,并在数据库中创建非级联外键约束.这是可选关系的默认设置.

根据EF中的默认约定(您可以覆盖),当FK标记为requiredIsRequired(true)时,级联删除将是删除相关主体记录的默认行为.

  • 不能使用IsRequired(true)DeleteBehaviour.SetNull,因为这没有意义,第一条语句说null是不允许的,第二条语句试图强制赋值null.

如果 Select 通过IsRequired(false)将FK设置为可选,则默认为OnDelete()DeleteBehaviour.ClientSetNull.这意味着删除主体实体时,只有在删除之前的上下文中加载的实体的FK才会设置为NULL.如果数据库中有其他记录引用了相同的FK值,则当您try 保存更改时,会由于违反数据库引用约束而失败.

如果希望数据库主动为引用相同FK值的数据库中的所有其他记录设置FK,则MUST指定OnDelete(DeleteBehavior.SetNull)以向将执行此清理逻辑的数据库添加约束.

IsRequired(bool)通常不需要与OnDelete()一起使用,但这只是因为您在FK特性上智能设置了可为空性.如果对FK使用阴影特性,则IsRequired()实际上是required,否则标准约定是使用FK的可为空性.

Csharp相关问答推荐

Serilog SQL服务器接收器使用UTC作为时间戳

下拉图片点击MudBlazor

如何在Reflection. Emit中使用具有运行时定义的类型参数的泛型类型

Elasticsearch:当我try 使用c#将嵌套对象添加到filter中时出现问题

如何从HttpContext获取请求正文

实体核心框架--HasColumnType和HasPrecision有什么不同?

Blazor. NET 8—阶段启动配置文件不启动网站VS2022

Azure函数中实体框架核心的依赖注入

UWP应用程序try 将打包的本机.exe文件加载为C#程序集

.NET SDK包中的官方C#编译器在哪里?

正在try 从Blazor中的API读取JSON

该函数不能检测两条曲线的交点

避免只读记录 struct 中的防御副本

当使用Dapper映射DBNull时,我可以抛出异常吗?

使用动态键从请求体反序列化JSON

如何使用.NET Aspire从Blazor应用程序与GRPC API通信?

如何将默认区域性更改为fr-FR而不是en-US?

忽略Visual Studio代码中的StyleCop规则

多个参数的最小API删除

将文本从剪贴板粘贴到RichTextBox时,新文本不会在RichTextBox ForeColor中着色