gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 05:57:53 26 4
gpt4 key购买 nike

环境:.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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com