在实体框架中添加与同一个表的第二个一对一关系

2023-11-22

我正在做代码优先的实体框架设计。

我有一个表 Account,它有一个属性 Supervisor:

public class Account
{
  public int Id { get; set; }
  public Account Supervisor { get; set; }
}

这效果很好。

但是,我希望在班级中添加一名候补主管:

public class Account
{
  public int Id { get; set; }
  public Account Supervisor { get; set; }
  public Account AlternateSupervisor { get; set; }
}

当我运行 Add-Migration AddAlternateSupervisor 时,生成的代码给出以下内容:

public partial class AddAlternateSupervisor : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropForeignKey(
            name: "FK_Accounts_Accounts_SupervisorId",
            table: "Accounts");

        migrationBuilder.DropIndex(
            name: "IX_Accounts_SupervisorId",
            table: "Accounts");

        migrationBuilder.AddColumn<int>(
            name: "AlternateSupervisorId",
            table: "Accounts",
            nullable: true);

        migrationBuilder.CreateIndex(
            name: "IX_Accounts_AlternateSupervisorId",
            table: "Accounts",
            column: "AlternateSupervisorId",
            unique: true,
            filter: "[AlternateSupervisorId] IS NOT NULL");

        migrationBuilder.AddForeignKey(
            name: "FK_Accounts_Accounts_AlternateSupervisorId",
            table: "Accounts",
            column: "AlternateSupervisorId",
            principalTable: "Accounts",
            principalColumn: "Id",
            onDelete: ReferentialAction.Restrict);
    }
    // snip
}

如您所见,EF 正在尝试将我的引用从 Supervisor 重命名为 AlternateSupervisor。我不希望这样,我希望 Supervisor 和 AlternateSupervisor 都引用其他帐户。

我知道 EF 无法处理多个多对多关系,但这些是一对一关系。我似乎找不到任何关于 EF 为何生成这样的迁移的信息。

那么,为什么实体框架尝试将 Supervisor 重命名为 AlternateSupervisor,以及如何强制它生成两个链接?

编辑:这个问题已按照最初的要求得到回答。然而,我想补充一点,所问的问题并没有多大的领域意义。谁听说过一个帐户只能监管另一个帐户?该关系是一对多的关系,通过使用WithMany而不是WithOne来解决。


EF Core 无法映射多个one-to-one按照惯例与同一实体。你必须这样做Fluent API如下:

Your Account class:

public class Account
{
    public int Id { get; set; }

    public int SupervisorId { get; set; }
    public Account Supervisor { get; set; }

    public int AlternateSupervisorId { get; set; }
    public Account AlternateSupervisor { get; set; }
}

然后在OnModelCreating of the DbContext如下:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);

     modelBuilder.Entity<Account>().HasOne(a => a.Supervisor).WithOne()
            .HasForeignKey<Account>(a => a.SupervisorId).OnDelete(DeleteBehavior.Restrict);

      modelBuilder.Entity<Account>().HasOne(a => a.AlternateSupervisor).WithOne()
            .HasForeignKey<Account>(a => a.AlternateSupervisorId).OnDelete(DeleteBehavior.Restrict);
 }

现在一切都会按预期生成!

注:我已经添加了SupervisorId and AlternateSupervisorId外键显式地指向Account模型类的可读性。如果您不明确想要这些,那么Fluent API配置应如下:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
     base.OnModelCreating(modelBuilder);

     modelBuilder.Entity<Account>().HasOne(a => a.Supervisor)
                  .WithOne().OnDelete(DeleteBehavior.Restrict);

      modelBuilder.Entity<Account>().HasOne(a => a.AlternateSupervisor)
                  .WithOne().OnDelete(DeleteBehavior.Restrict);
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在实体框架中添加与同一个表的第二个一对一关系 的相关文章

随机推荐

  • Dask read_csv 失败,而 pandas 则失败

    尝试使用 dask 的read csv在文件中 pandas 的位置read csv像这样 dd read csv data ecommerce new csv 失败并出现以下错误 pandas errors ParserError Err
  • 使用子类对象访问超类函数

    我有一个扩展其超类的子类对象 子类中有一个重写的方法 可以使用该对象调用 是否可以使用子类对象调用超类的函数 package supercall public class Main public static void main Strin
  • 如何编写可以运行 x86 十六进制代码的 C 程序

    我有一组十六进制代码 可以转换为汇编指令 我想用 C 语言创建可以执行这些指令的程序 unsigned char rawData 5356 0x4C 0x01 0x0A 0x00 0x00 0x00 0x00 0x00 0x64 0x0C
  • 如何在 php 中从 .doc 模板创建 word .doc 文件

    我需要从Word模板创建一个Word文档 就像我们需要用值替换模板中的几个字符串 比如变量 请告诉我们如何在 PHP 或 cakePHP 中做到这一点 我建议查看 phpLiveDocx http www phplivedocx org 还
  • 存储指令是否会在缓存未命中时阻塞后续指令?

    假设我们有一个具有两个核心 C0 和 C1 的处理器和一个从地址开始的高速缓存行k最初由 C0 拥有 如果 C1 在第 8 行的 8 字节槽上发出存储指令k 这会影响 C1 上执行的以下指令的吞吐量吗 intel优化手册有如下一段 当指令将
  • Java 的接口优势

    我的问题很简单 如果接口由单个类实现 那么使用接口有什么优势吗 我一直认为只有当接口有多个实现时 接口才是好的 Thanks 一句话 不 接口所表示的契约可以直接在您唯一的类中指定 如果您清楚将来不需要相同方法的另一个实现 则可以避免定义接
  • 选择框选项上的工具提示

    我有一个选择框 其中选项具有策略名称 我需要在选项的工具提示中显示策略的描述 我尝试了tipr插件 其中使用了data tip选项 它适用于 div span 等 但不适用于选择框选项 我还尝试了上面链接中附加的正常方法 仅当下拉列表默认打
  • .NET 5 GRPC 客户端调用引发异常:在未启用 HTTP/2 的情况下使用版本策略 RequestVersionOrHigher 请求 HTTP 版本 2.0

    这是我的第一个 gRPC 应用程序 我尝试从 NET 5 gRPC 客户端 Grpc Net Client 2 35 0 调用服务器流式 RPC 调用 这会在我的本地开发环境中导致以下异常 Grpc Core RpcException 状态
  • 如何在google v8(和nodejs)中渲染32位unicode字符

    有谁知道如何在谷歌v8 驱动谷歌浏览器和nodejs的javascript虚拟机 中渲染unicode 星体平面 字符 其CID超出0xffff 有趣的是 当我给google chrome 它标识为11 0 696 71 在ubuntu 1
  • 如何使用 FieldValue.serverTimestamp() 在 android 中自定义模型类

    我使用 Firestore 作为数据库 现在我想在用户注册时存储服务器时间戳 来自 Firestore 文档 Map
  • 使用 jquery 增加和减少输入值

    单击 和 按钮时我需要增加和减少输入的值 但它似乎不起作用 我从这篇文章中得到了代码 如何使用 jQuery 增加数量字段的值 单击添加按钮时 我插入了一条 console log 语句以进行调试 令人惊讶的是 即使我单击了 id 为 ad
  • 分布式作业调度、管理和报告

    我最近玩了Hadoop它对 MapReduce 作业的调度 管理和报告印象深刻 它似乎使新作业的分配和执行变得非常无缝 使开发人员能够专注于其作业的实施 我想知道Java领域中是否存在一些对于作业的分布式执行来说不容易表达为MapReduc
  • RandomNumber 方法每次调用都返回相同的数字

    每次从 for 循环中调用 RandomNumber 方法时 我都尝试生成不同的随机数 现在 它每次都返回相同的数字 这是我的 RandomNumber 方法 private int RandomNumber int min int max
  • 我如何模拟 java.time.LocalDate.now()

    在我的测试用例中 我需要测试时间敏感的方法 在该方法中我们使用 java 8 类 LocalDate 它是not Joda 当我运行测试时 我可以做什么来改变时间 在您的代码中 替换LocalDate now with LocalDate
  • 语音合成 API 在说出单词时突出显示单词

    目前 我正在制作一个简单的应用程序 其中使用语音合成 API 说出文本 我想突出显示正在说出的单词 粗体 我目前有一个非常基本的实现 使用 onboundary 事件来执行此操作 然而 我想知道是否有更好 更好的方法来做到这一点 因为我的实
  • 为什么这个图像在Java中按比例缩小后看起来这么糟糕?

    这是原始图像 http rank my public images uploaded orig 4193395691714613396 png 这里它被缩小到 300x225 http rank my public images uploa
  • 在 .NET/C# 中使用委托加速反射 API

    This post有评论if you need to call the method multiple times use reflection once to find it then assign it to a delegate an
  • URIBuilder 和列表查询参数

    我正在使用阿帕奇URI生成器构建一个查询字符串获取方法的休息服务 RequestMapping value remote public Return getTest Ordine ordine throws Exception 这是输入对象
  • Java重构工具[重复]

    这个问题在这里已经有答案了 可能的重复 像 ReSharper 这样的工具 但适用于 Java 我非常频繁地使用 Eclipse 提供的 Java 代码重构工具 提取接口 重命名方法等 有谁知道其他类似的工具 最好是 Eclipse 插件
  • 在实体框架中添加与同一个表的第二个一对一关系

    我正在做代码优先的实体框架设计 我有一个表 Account 它有一个属性 Supervisor public class Account public int Id get set public Account Supervisor get