如何在Entity Framework Core中创建一对一关系?

问题描述 投票:1回答:2

让我们从一对多关系开始:

public sealed class MyContext : DbContext
{
  protected override void OnModelCreating(ModelBuilder builder)
  {
    builder.Entity<Slave>()
           .HasOne(typeof(Master))
           .WithMany() // *
           .HasForeignKey(nameof(Slave.ForeignField));
  }
}

因此,我声明主表中的每条记录我都可以在从表中有多条记录。当我运行EF工具来构建迁移时,这被接受并且工作正常。

但是当我将标有星号的行更改为:

           .WithOne()

为了建立一对一的关系,建立迁移失败并显示错误:

您正在配置“从站”和“主站”之间的关系,但是在“ ForeignField”上指定了外键。外键必须在关系的一种类型上定义。

[我不知道,只是一秒钟前给定的字段(以C#表示的属性)还可以,现在EF声称找不到它?

我会想念吗?如何让EF开心?

记录类型如下-请注意,有no导航属性。

internal sealed class Slave
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid InstanceId { get; set; }

    public Guid ForeignField { get; set; }
}

internal sealed class Master
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public Guid Id { get; set; }
}

暂时我使用原始SQL解决了这个问题,它可以工作,但是我仍然很好奇这里出了什么问题。


感谢@AminGolmahalle的回答,引发了我的好奇心,为什么我可以以通用形式使用HasForeignKey。这使我发现我不能,但是WithOneWithMany不是彼此1:1替代。两者都会导致不同的过载。

所以第一个版本是一对多的,因为我遇到了正确的重载,而第二个版本则没有,因为我传递了错误的参数。正确的版本是:

builder.Entity<Slave>()
       .HasOne(typeof(Master))
       .WithOne() 
       .HasForeignKey(nameof(Slave), nameof(Slave.ForeignField)); // changed

第一个参数必须是从属表的名称(再次)。

但是切换到通用版本更好(请参见接受的答案下的最后评论),并且首先避免出现这种“愚蠢”错误的可能性。

c# entity-framework-core one-to-one
2个回答
2
投票

下面的代码只是用于一对一关系的示例:


0
投票
Refer this link, i think this will do

0
投票

感谢@AminGolmahalle的回答,引发了我的好奇心,为什么我可以以通用形式使用HasForeignKey。这使我发现我不能,但是WithOneWithMany不是彼此1:1替代。两者都会导致不同的过载。

© www.soinside.com 2019 - 2024. All rights reserved.