Luc*_*cas 6 c# entity-framework properties entity-framework-core
我在设置 Entity Framework Core 外键时遇到了一个奇怪的问题。EF 不断为我的属性自动添加影子属性,并为其创建外键。
但是,这对我来说非常好 - 我希望能够将外键删除行为设置为级联 - 使用“自动”阴影属性我不允许这样做。
因此我决定使用 Fluent API 创建我自己的外键:
modelBuilder.Entity<PostDataModel>(e =>
{
// Primary key
e.HasKey(c => c.Id);
// Relation
e.HasOne<PostGroupDataModel>()
.WithMany()
.HasForeignKey("GroupId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
Run Code Online (Sandbox Code Playgroud)
然而,这并没有多大帮助 - 仍在为表 ( GroupId1)生成自动生成的阴影属性:
public class PostGroupDataModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Params { get; set; }
public List<PostDataModel> Posts { get; set; }
}
public class PostDataModel
{
public int Id { get; set; }
public string Content { get; set; }
public PostGroupDataModel Group { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
有没有办法关闭 EF Core 中阴影属性的自动生成?或者至少修改生成的阴影属性以在级联上删除?
问题不在于shadow属性,而在于流畅的配置:
e.HasOne<PostGroupDataModel>()
.WithMany()
Run Code Online (Sandbox Code Playgroud)
通过使用无参数重载,您可以有效地告诉 EF在两端创建没有导航属性的关系,它确实做到了。但是,您确实有导航属性,因此 EF Core 会创建与传统 FK 属性/列名称的另一种关系。仅仅因为默认名称GroupId已经为您的显式关系保留,它会在其后附加数字以使其唯一。
解决方案是始终使用表示导航属性存在/不存在的Has/With重载。在你的情况下:
e.HasOne(x => x.Group)
.WithMany(x => x.Posts)
Run Code Online (Sandbox Code Playgroud)
您可以保留 fluent 配置的其余部分,但由于GroupId在这种情况下是 FK 属性/列的默认值,.HasForeignKey("GroupId")因此可以跳过。也因为DeleteBehavior.Cascade是必需关系的默认值,所以.OnDelete(DeleteBehavior.Cascade)也可以跳过,唯一剩下的可能是.IsRequired(). IE
.HasForeignKey("GroupId") // optional
.OnDelete(DeleteBehavior.Cascade) // optional
.IsRequired();
Run Code Online (Sandbox Code Playgroud)
当然,明确指定它们不会有什么坏处。