【发布时间】:2021-10-10 20:48:11
【问题描述】:
环境:.Net 5.0、EntityFrameworkCore 5.0、MS Sql Server
我已经在我的数据库中设置了一对多关系(使用HasForeignKey),但是当我尝试使用.Include(x => x.Parent) 从子级访问父记录时,我得到一个无效的列名错误。我过去做过很多次这种类型的事情,但总是Child 表有一个名为ParentTableName + Id 的属性(以及所述属性上的FK)。在这种失败的情况下,属性与该模式不匹配。
所以我的问题是:为什么 EF 会忽略我的 Fluent API 配置?在我看来,如果我正确设置了关系(并且每列上的数据类型匹配),那么该列被称为什么并不重要。在流畅的 api 设置中我需要采取一些额外的步骤吗?请参见下面的示例:
public class Parent
{
public int Id { get; set; }
public IEnumerable<Child> Children { get; set; }
}
public class Child
{
public int Id { get; set; }
public int ForeignKeyName { get; set; } // This could say anything, just not "ParentId"
[NotMapped] // Included so add-migration doesn't try to create a mapping, but when removed I get the same error
public Parent Parent { get; set; }
}
还有我的配置
modelBuilder.Entity<Parent>(entity =>
{
entity.HasMany<Child>()
.WithOne(x => x.Parent)
.HasForeignKey(x => x.ForeignKeyName);
});
失败的用法:
var children = _context.Children.Include(x => x.Parent).ToList(); // Says "Invalid Column Name 'ParentId'"
外键已在数据库中设置,但当我尝试运行 add-migration 时,它仍然建议创建 a) 在 Child 上创建一个名为 ParentId 的新列(为什么?),b) 在所述列,以及 c) 使用ParentId 的外键。我宁愿了解这里发生了什么,也不愿只是更改属性名称并保持幸福的无知。
编辑 由于评论线程很长,因此更新以明确答案。关键是要确保 [NotMapped] 在两个导航属性上,并且(在下面的回答中)让流式 API 引用两个方向(父到子和子到父)的关系。
【问题讨论】:
标签: c# entity-framework .net-core entity-framework-core