EF Core 中自动生成的 FK 关系 - 如何使它们不可为空
Auto-generated FK relations in EF Core - how to made them non-nullable
-
domain-driven-design
-
entity-framework-core
-
.net-core
-
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 自动推断 Parent
和 Child
之间的引用关系,并生成以下迁移,在 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 不可空引用类型(例如 Parent
与 Parent?
) ,并且没有具有不可空类型的显式 FK 属性(例如 int
与 int?
),唯一剩下的选项是流利的 API.
关系流畅 API 至少需要 正确 Has
+ With
对,然后在这种特殊情况下 IsRequired()
方法:
modelBuilder.Entity<Parent>()
.HasMany(e => e.Childs) // collection navigation property
.WithOne() // no reference navigation property
.IsRequired();
domain-driven-design
entity-framework-core
.net-core
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 自动推断 Parent
和 Child
之间的引用关系,并生成以下迁移,在 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 不可空引用类型(例如 Parent
与 Parent?
) ,并且没有具有不可空类型的显式 FK 属性(例如 int
与 int?
),唯一剩下的选项是流利的 API.
关系流畅 API 至少需要 正确 Has
+ With
对,然后在这种特殊情况下 IsRequired()
方法:
modelBuilder.Entity<Parent>()
.HasMany(e => e.Childs) // collection navigation property
.WithOne() // no reference navigation property
.IsRequired();