Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在实体框架中添加与同一表的第二个一对一关系

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

Stack Overflow用户
提问于 2019-03-20 00:55:46
回答 1查看 2.4K关注 0票数 4

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Account
{
  public int Id { get; set; }
  public Account Supervisor { get; set; }
}

这个很好用。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Account
{
  public int Id { get; set; }
  public Account Supervisor { get; set; }
  public Account AlternateSupervisor { get; set; }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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。我不想这样,我希望主管和AlternateSupervisor都引用其他帐户。

我知道EF不能处理多对多关系,但这些是一对一的关系。我似乎找不到任何关于EF为什么会产生这样的迁移的信息。

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

编辑:此问题已按最初询问的方式回答。然而,我想补充的是,正如所问的那样,这个问题并没有太多的领域意义。谁听说过一个帐户只能管理另一个帐户?该关系是一对多关系,通过使用WithMany而不是WithOne来解决。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-20 01:37:17

按照约定,EF核心不能将多个one-to-one映射到同一实体。您必须使用Fluent API执行此操作,如下所示:

您的Account类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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; }
}

然后在DbContextOnModelCreating中,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
 }

现在,一切都将按预期生成!

注意:为了提高可读性,我在Account模型类中显式地添加了SupervisorIdAlternateSupervisorId外键。如果您不需要这些显式配置,则Fluent API配置应如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
 }
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55252077

复制
相关文章
浅析深度学习在实体识别和关系抽取中的应用
实体识别 作者:蒙 康 编辑:黄俊嘉 命名实体识别 1 命名实体识别(Named Entity Recognition,NER)就是从一段自然语言文本中找出相关实体,并标注出其位置以及类型,如下
机器学习算法工程师
2018/03/06
2.4K0
浅析深度学习在实体识别和关系抽取中的应用
浅析深度学习在实体识别和关系抽取中的应用
实体识别 作者:蒙 康 编辑:黄俊嘉 命名实体识别 1 命名实体识别(Named Entity Recognition,NER)就是从一段自然语言文本中找出相关实体,并标注出其位置以及类型,如下图。命名实体识别是NLP领域中的一些复杂任务的基础问题,诸如自动问答,关系抽取,信息检索等 ,其效果直接影响后续处理的效果,因此是NLP研究的一个基础问题。 NER一直是NLP领域中的研究热点,现在越来越多的被应用于专业的领域,如医疗、生物等。这类行业往往具有大量的专业名词,名词与名词之间相互之间存在着不同种类
企鹅号小编
2018/01/10
1.9K0
浅析深度学习在实体识别和关系抽取中的应用
ERICA:提升预训练语言模型实体与关系理解的统一框架
近年来,预训练语言模型(PLM)在各种下游自然语言处理任务中表现出卓越的性能,受益于预训练阶段的自监督学习目标,PLM 可以有效地捕获文本中的语法和语义,并为下游 NLP 任务提供蕴含丰富信息的语言表示。然而,传统的预训练目标并没有对文本中的关系事实进行建模,而这些关系事实对于文本理解至关重要。
AI科技评论
2021/07/03
7490
ERICA:提升预训练语言模型实体与关系理解的统一框架
零代码实现一对一表关系和无限主子表级联保存
在上一篇 表关系管理 中,介绍了订单中一对多、多对一、以及多对多关系,本文主要介绍一对一关系和无限主子表在crudapi系统中的应用。
crudapi
2021/08/21
7640
零代码实现一对一表关系和无限主子表级联保存
提升PLM实体与关系理解,ERICA一个框架就够了
机器之心专栏 作者:秦禹嘉 在这篇被 ACL 2021 主会录用的文章中,研究者提出了 ERICA 框架,通过对比学习帮助 PLM 提高实体和实体间关系的理解,并在多个自然语言理解任务上验证了该框架的有效性。 近年来,预训练语言模型(PLM)在各种下游自然语言处理任务中表现出卓越的性能,受益于预训练阶段的自监督学习目标,PLM 可以有效地捕获文本中的语法和语义,并为下游 NLP 任务提供蕴含丰富信息的语言表示。然而,传统的预训练目标并没有对文本中的关系事实进行建模,而这些关系事实对于文本理解至关重要。
机器之心
2023/03/29
4720
提升PLM实体与关系理解,ERICA一个框架就够了
数据层框架应用--Mybatis(三)关系映射之一对一关系映射
实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系。
lomtom
2021/10/27
1.1K0
数据层框架应用--Mybatis(三)关系映射之一对一关系映射
Hibernate实体关系映射
上一篇文章我们学习了Hibernate的框架搭建,并且完成了单表的CRUD操作,今天我们来学习Hibernate中的多表关联。
南风
2019/04/22
1.1K0
Hibernate实体关系映射
C#-using与添加引用的关系
项目添加引用的目的是引入程序集 程序集的概念是什么? 程序集是一个 DLL,这是调用其中类的必备条件 一个程序集包括一个或多个命名空间 举例来说 命名空间 System.Data 来自文件System.Data.DLL 命名空间System.Data.SqlClient 同样来自System.Data.DLL 那么意味着你一旦添加了 System.Data 程序集 文件的引用(无论你是从 GAC 添加还是直接添加的 DLL 到项目) 你就可以使用 System.Data 和 System.Data.SqlClient 下的各种类
zls365
2020/08/19
9200
实体-联系图(ER图)_实体关系图
我们通常用实体、联系和属性这三个概念来理解现实问题,因此ER模型比较接近人的思维方式。此外,ER模型用简单的图形符号表达系统分析员对问题域的理解,不熟悉计算机技术的用户也能理解它,因此,ER模型可以作为用户与分析员之间有效的交流工具。
全栈程序员站长
2022/09/29
2.3K0
实体-联系图(ER图)_实体关系图
在微服务框架Demo.MicroServer中添加对MongoDB的支持
本编文章所属的微服务框架代码和对mongo支持的代码全部放在github,地址:https://github.com/PeyShine/Demo.MicroServer
Peyshine
2020/05/19
7940
在微服务框架Demo.MicroServer中添加对MongoDB的支持
「数据架构」实体关系模型溯源
实体-关系模型(或ER模型)描述特定知识领域中相关的事物。基本的ER模型由实体类型(对感兴趣的事物进行分类)和指定实体之间可能存在的关系(那些实体类型的实例)组成。
架构师研究会
2019/12/24
1.6K0
什么是实体关系图(ERD)?
实体 - 关系(ER)图(也称为ERD或ER模型)是Peter最初在1976年提出的经典且流行的概念数据模型。它是系统内不同实体的视觉表示以及它们如何相互关联。实体关系图广泛用于设计关系数据库。ER模式中的实体成为表,属性和转换的数据库模式。由于它们可用于可视化数据库表及其关系,因此它通常也用于数据库故障排除。
Warren2Lynch
2018/07/23
6.5K0
什么是实体关系图(ERD)?
Android编程权威指南笔记3:Android Fragment讲解与Android Studio中的依赖关系,如何添加依赖关系
片段是一个应用程序的用户界面或行为,可以放在一个Activity。与碎片的交互是通过FragmentManager,可以通过Activity.getFragmentManager()和 获得 Fragment.getFragmentManager()。
达达前端
2022/04/28
1.8K0
Android编程权威指南笔记3:Android Fragment讲解与Android Studio中的依赖关系,如何添加依赖关系
知识图谱从哪里来:实体关系抽取的现状与未来
最近几年深度学习引发的人工智能浪潮席卷全球,在互联网普及带来的海量数据资源和摩尔定律支配下飞速提升的算力资源双重加持下,深度学习深入影响了自然语言处理的各个方向,极大推动了自然语言处理的发展。来到2019年的今天,深度学习的诸多局限性也慢慢得到广泛认知。对于自然语言处理而言,要做到精细深度的语义理解,单纯依靠数据标注与算力投入无法解决本质问题。如果没有先验知识的支持,“中国的乒乓球谁都打不过”与“中国的足球谁都打不过”,在计算机看来语义上并没有巨大差异,而实际上两句中的“打不过”意思正好相反。因此,融入知识来进行知识指导的自然语言处理,是通向精细而深度的语言理解的必由之路。然而,这些知识又从哪里来呢?这就涉及到人工智能的一个关键研究问题——知识获取。
Datawhale
2019/11/18
5280
知识图谱从哪里来:实体关系抽取的现状与未来
最近几年深度学习引发的人工智能浪潮席卷全球,在互联网普及带来的海量数据资源和摩尔定律支配下飞速提升的算力资源双重加持下,深度学习深入影响了自然语言处理的各个方向,极大推动了自然语言处理的发展。
AI科技评论
2019/11/26
9700
知识图谱从哪里来:实体关系抽取的现状与未来
最近几年深度学习引发的人工智能浪潮席卷全球,在互联网普及带来的海量数据资源和摩尔定律支配下飞速提升的算力资源双重加持下,深度学习深入影响了自然语言处理的各个方向,极大推动了自然语言处理的发展。来到2019年的今天,深度学习的诸多局限性也慢慢得到广泛认知。对于自然语言处理而言,要做到精细深度的语义理解,单纯依靠数据标注与算力投入无法解决本质问题。如果没有先验知识的支持,“中国的乒乓球谁都打不过”与“中国的足球谁都打不过”,在计算机看来语义上并没有巨大差异,而实际上两句中的“打不过”意思正好相反。因此,融入知识来进行知识指导的自然语言处理,是通向精细而深度的语言理解的必由之路。然而,这些知识又从哪里来呢?这就涉及到人工智能的一个关键研究问题——知识获取。
大数据文摘
2019/11/20
8230
知识图谱从哪里来:实体关系抽取的现状与未来
知识图谱从哪里来:实体关系抽取的现状与未来
最近几年深度学习引发的人工智能浪潮席卷全球,在互联网普及带来的海量数据资源和摩尔定律支配下飞速提升的算力资源双重加持下,深度学习深入影响了自然语言处理的各个方向,极大推动了自然语言处理的发展。来到2019年的今天,深度学习的诸多局限性也慢慢得到广泛认知。对于自然语言处理而言,要做到精细深度的语义理解,单纯依靠数据标注与算力投入无法解决本质问题。如果没有先验知识的支持,“中国的乒乓球谁都打不过”与“中国的足球谁都打不过”,在计算机看来语义上并没有巨大差异,而实际上两句中的“打不过”意思正好相反。因此,融入知识来进行知识指导的自然语言处理,是通向精细而深度的语言理解的必由之路。然而,这些知识又从哪里来呢?这就涉及到人工智能的一个关键研究问题——知识获取。
数据派THU
2019/11/18
7540
ER图转关系模型_实体关系图变关系模型
将每个实体类型转换成一个关系模式,实体的 属性 即为关系的 属性,实体标识符即为关系的键。
全栈程序员站长
2022/11/15
2.7K0
ER图转关系模型_实体关系图变关系模型
【自然框架】之 “表单控件”与“实体类”
      对于简单的添加、修改,也就是没有什么业务逻辑的那种,表单控件的工作步骤是这样的,以添加数据为例。这个不用写什么代码,点点鼠标就可以搞定了。       但是对于复杂的业务逻辑的需求,就不能
用户1174620
2018/02/26
8670
【自然框架】之 “表单控件”与“实体类”
点击加载更多

相似问题

实体框架-与同一表的一对一可选关系

19

实体框架核心上同一表的一对一关系

20

实体框架--一对一的关系--首先用代码添加实体

27

与实体框架的一对一可选关系

20

实体框架6:一对一与继承的关系

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文