当前位置: 首页 > 知识库问答 >
问题:

EFCore可为Null的关系设置onDelete:ReferentialAction。限制

岳阳文
2023-03-14

我正在运行efcore 2.0.1。

我有一个模型:

public class BigAwesomeDinosaurWithTeeth
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }

    public ICollection<YummyPunyPrey> YummyPunyPrey { get; set; }
}
public class YummyPunyPrey
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid Id { get; set; }
    public Guid? BigAwesomeDinosaurWithTeethId { get; set; }

    [ForeignKey("BigAwesomeDinosaurWithTeethId")]
    public BigAwesomeDinosaurWithTeeth BigAwesomeDinosaurWithTeeth { get; set; }

}

我在这两个类上没有流利的api。但当我生成迁移时

constraints: table =>
            {
                table.PrimaryKey("PK_YummyPunyPrey", x => x.Id);
                table.ForeignKey(
                    name: "FK_YummyPunyPrey_BigAwesomeDinosaurWithTeeth_BigAwesomeDinosaurWithTeethId",
                    column: x => x.BigAwesomeDinosaurWithTeethId,
                    principalTable: "BigAwesomeDinosaurWithTeeth",
                    principalColumn: "Id",
                    onDelete: ReferentialAction.Restrict);
            });

为什么它会生成onDelete:ReferentialAction。当文档说明应将其作为ClientSetNull处理时进行限制

https://docs.microsoft.com/en-us/ef/core/saving/cascade-delete

行为名称|对记忆中的依赖项/子项的影响|对数据库中的依赖项/子项的影响

ClientSetNull(默认)|外键属性设置为null |无

EF Core 2.0中的更改:在早期版本中,Restrict将导致跟踪的依赖实体中的可选外键属性设置为null,并且是可选关系的默认删除行为。在EF Core 2.0中,引入ClientSetNull来表示该行为,并成为可选关系的默认值。对限制行为进行了调整,使其不会对依赖实体产生任何副作用。

任何关于为什么会发生这种情况的帮助都将不胜感激。

共有1个答案

郜德容
2023-03-14

EF Core 2.0.1元数据和迁移使用不同的枚举来指定删除行为,分别是DeleteBehaviorReferentialAction。虽然第一种方法有很好的文档记录,但第二种方法和两者之间的映射没有(在撰写本文时)。

这是当前映射:

DeleteBehavior    ReferentialAction
==============    =================
Cascade           Cascade
ClientSetNull     Restrict
Restrict          Restrict
SetNull           SetNull

在您的情况下,该关系是可选的,因此按约定的删除行为是ClientSetNull,它映射到onDelete:Restrict,或者换句话说,强制(启用)FK而不级联删除。

如果您想要不同的行为,您必须使用Fluent API,例如。

modelBuilder.Entity<BigAwesomeDinosaurWithTeeth>()
    .HasMany(e => e.YummyPunyPrey)
    .WithOne(e => e.BigAwesomeDinosaurWithTeeth)
    .OnDelete(DeleteBehavior.SetNull); // or whatever you like
 类似资料:
  • 问题内容: 我想开始在新项目中使用表关系。 经过一番搜索之后,我将2个表设置为InnoDB: 我要链接的键是 ->用户->用户ID(主要)->会话->用户ID(索引) 在此过程中,我唯一不了解的是“更新时”和“删除时”的不同设置做了什么 这里的选项是: - (没有?) 级联(???) 设置为空(将所有内容设置为空吗?) 不采取行动(嗯…) 限制 (???) 我基本上希望在用户完全删除后删除会话中的

  • 使用斜扣。ASP中的AspNetCore。NET Core webapp,我们有如下响应类型: 使用Swashback发出swagger API JSON时,这将变成: 这里的问题是,DateTime是一种值类型,不能为null;但是发出的Swagger API JSON没有将这两个属性标记为必需的。这种行为对于所有其他值类型都是一样的:int、long、byte等,它们都被认为是可选的。 为了完

  • 问题内容: 我如何从elasticsearch中获取所有结果,因为结果仅显示限制为10。我有一个查询,像: 我已将限制设置为15,但我不想使其无限,以便我可以获取所有数据,因为我的数据不断变化,并且我想获取所有数据,所以我无法设置限制。 问题答案: 您可以使用和参数浏览所有数据。这可能非常慢,具体取决于您的数据以及索引中有多少。 http://www.elastic.co/guide/zh-CN/

  • 问题内容: 我正在使用Spring将JMS连接工厂注入到我的Java应用程序中。由于仅在生产环境中才需要该工厂,但是在开发过程中却不需要,因此我将Bean定义放入单独的XML中,并将其包含在主applicationContext.xml中。在生产环境中,此额外文件包含常规bean定义。在我的本地开发环境中,我希望此bean为null。当Spring遇到一个未知的引用ID时,试图完全完全删除Bean

  • 关闭连接引用后是否需要/良好做法将其设置为null? 在性能测试期间,我面临连接等待超时异常,因为超过了最大连接数。

  • Repository This repository is home to the following .NET Foundation projects. These projects are maintained by Microsoft and licensed under the MIT License. Entity Framework Core Microsoft.Data.Sqlite