c# - 关闭阴影属性生成
问题描述
我在设置 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 中关闭影子属性的自动生成?或者至少修改生成的阴影属性以在级联上删除?
解决方案
问题不是阴影属性,而是流畅的配置:
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();
当然,明确指定它们不会受到伤害。
推荐阅读
- javascript - 如何修复“预期 [Array(9)] 到深度相等 [Array(11)]”错误
- javascript - 我无法保存特定的选定值。它保存了数据库中的所有数据
- python - TensorFlow 2.0:如何更新张量?
- javascript - 从脚本更改 href 的文本会使文本消失而不改变
- c++ - 如何为 std::array 中的 std::vectors 保留内存?
- c++ - STL 中的容器,类似于对,但有两个以上的数据元素
- mapbox-ios - 通过颜色特征属性设置 MGLFillStyleLayer 的 FillColor
- reactjs - 如何将 axios 数据加载为初始 redux 状态
- python-3.x - 如何在keras的自定义损失函数中调用全局变量来改变损失函数的返回值
- c# - 使用 Linq Select 时出现 ArgumentNullException