EF Core 中自动生成的 FK 关系 - 如何使它们不可为空

Auto-generated FK relations in EF Core - how to made them non-nullable

我有以下型号:

public class Child
{
    public int Id { get; set; }
}

public class Parent
{
    public int Id { get; set; }
    public List<Child> Childs { get; set; }
}

无需任何进一步指示,EF Core 3.1 自动推断 ParentChild 之间的引用关系,并生成以下迁移,在 Child [=37 上创建可为空的外键列=]:

....

migrationBuilder.CreateTable(
        name: "Child",
        columns: table => new
        {
            Id = table.Column<int>(nullable: false)
                .Annotation("SqlServer:Identity", "1, 1"),
            ParentId = table.Column<int>(nullable: true)   // <--- !!
        },
        constraints: table =>
        {
            table.PrimaryKey("PK_Child", x => x.Id);
            table.ForeignKey(
                name: "FK_Child_Parent_ParentId",
                column: x => x.ParentId,
                principalTable: "Parent",
                principalColumn: "Id",
                onDelete: ReferentialAction.Restrict);
        });

导致以下架构:

不过我需要 FK 不可为 null。如何强制 EF 在不 更改模型的情况下执行此操作(无需引入仅用于定义底层存储关系的人工属性)?


PS:特别是我想避免通过引入双向引用来滥用模型,只是为了能够表达我需要的东西,例如

public class Child
{
    public int Id { get; set; }
    public Parent Parent { get; set; }   // <--- not acceptable
}

modelBuilder.Entity<Parent>()
    .HasMany(p => p.Childs)
    .WithOne(c => c.Parent)
    .IsRequired();   // <--- non-null

是否手动干预迁移代码是唯一的解决方案(那样不会导致与模型快照不匹配)?

由于依赖实体没有引用导航 属性 可以在其上放置 [Required] 属性或使用 C# 8 不可空引用类型(例如 ParentParent?) ,并且没有具有不可空类型的显式 FK 属性(例如 intint?),唯一剩下的选项是流利的 API.

关系流畅 API 至少需要 正确 Has + With 对,然后在这种特殊情况下 IsRequired()方法:

modelBuilder.Entity<Parent>()
    .HasMany(e => e.Childs) // collection navigation property
    .WithOne() // no reference navigation property
    .IsRequired();