c# - 不同列名的 EF Core 5 HasForeignKey 问题

标签 c# entity-framework .net-core entity-framework-core

环境:.Net 5.0、EntityFrameworkCore 5.0、MS SQL Server

我已经在我的数据库中建立了一对多关系(使用 HasForeignKey),但是当我尝试使用 .Include(x => x.Parent) 我收到一个无效的列名错误。我过去做过很多次这种类型的事情,但它总是与 Child 表有一个名为 ParentTableName + 编号。在这种失败的情况下,该属性与该模式不匹配。

所以我的问题是:为什么 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 在两个方向(父到子和子到父)引用关系。

最佳答案

此代码已在 VS 2019 中测试。成功创建了具有 ForeignKeyName ForeignKey 的数据库。

你必须修复类

public class Parent
{
   [Key]
    public int Id { get; set; }
    [InverseProperty(nameof(Child.Parent))]
    public IEnumerable<Child> Children { get; set; }
}

public class Child 
{
    [Key]
    public int Id { get; set; }

    public int ForeignKeyName { get; set; } 

    [ForeignKey(nameof(ForeignKeyName))]
    [InverseProperty("Children")]
    public Parent Parent { get; set; }
}

或数据库上下文

          modelBuilder.Entity<Child>(entity =>
            {
                entity.HasOne(d => d.Parent)
                   .WithMany(p => p.Children)
                   .HasForeignKey(d => d.ForeignKeyName);
            });

您必须删除以前的 Migrations 文件夹并删除以前的数据库。在此之后使用 Add-Migration InitialCreate 进行明确的迁移。然后使用 Update-Database。

关于c# - 不同列名的 EF Core 5 HasForeignKey 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68673428/

相关文章:

c# - 使用文档哈希比较签名的 PDF 和未签名的 PDF

php - Doctrine 一对多关系 - "No identifier/primary key specified"

c# - Entity Framework - 从 View 创建模型?

c# - Azure DevOps - .NET Core 构建包括 Web.config 文件

c# - 使用 ITextSharp(旧版本)将多个文件合并为 pdf

c# - 如何在自分层树结构中的每个节点执行业务规则

c# - 禁用字段的 MVC "must be a number"数据类型验证

c# - ASP.NET 模态弹出窗口,完全来自代码隐藏?

c# - EF 5 数据库首先使用自定义验证

.net-core - 如何从不同的程序集在 Automapper 中注册配置文件?