首页 > 解决方案 > 关闭阴影属性生成

问题描述

我在设置 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();
});

然而,这并没有太大帮助 - 仍在为表 ( 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; }
}

有没有办法在 EF Core 中关闭影子属性的自动生成?或者至少修改生成的阴影属性以在级联上删除?

标签: c#entity-frameworkpropertiesentity-framework-core

解决方案


问题不是阴影属性,而是流畅的配置:

e.HasOne<PostGroupDataModel>()
    .WithMany()

通过使用无参数重载,您实际上是在告诉 EF 创建两端没有导航属性的关系,它确实如此。但是,您确实有导航属性,因此 EF Core 创建了另一个与常规 FK 属性/列名称的关系。仅仅因为默认名称GroupId已经为您的显式关系保留,它会将数字附加到它以使其唯一。

解决方案是始终使用表示存在/不存在导航属性的Has/重载。With在你的情况下:

e.HasOne(x => x.Group)
    .WithMany(x => x.Posts)

您可以保留 fluent 配置的其余部分,但由于GroupId在这种情况下是 FK 属性/列的默认值,.HasForeignKey("GroupId")因此可以跳过。也因为DeleteBehavior.Cascade是所需关系的默认值,.OnDelete(DeleteBehavior.Cascade)也可以跳过,唯一剩下的可能是.IsRequired(). IE

.HasForeignKey("GroupId") // optional
.OnDelete(DeleteBehavior.Cascade) // optional
.IsRequired();

当然,明确指定它们不会受到伤害。


推荐阅读