我有以下模型:
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会自动推断Parent
和Child
之间的引用关系,并在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);
});
产生以下模式:
我需要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
手动干预迁移代码是否是唯一的解决方案(这是否会导致与模型快照不匹配)?