关闭影子属性生成

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 中阴影属性的自动生成?或者至少修改生成的阴影属性以在级联上删除?

Iva*_*oev 8

问题不在于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)

当然,明确指定它们不会有什么坏处。