在EF Core中自动生成的FK关系-如何使其不为空

时间:2020-01-18 12:11:14

标签: .net-core entity-framework-core domain-driven-design entity-framework-core-migrations entity-framework-core-3.1

我有以下模型:

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表上生成以下可迁移为空的外键列的迁移:

....

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);
        });

产生以下模式:

enter image description here

我需要FK不可为空。如何无需更改模型(无需引入人工属性仅用于定义底层存储关系)来强制执行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

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

0 个答案:

没有答案