在.Net Core / EF Core中设置同一类的多个外键

2023-11-27

我正在构建一个 .Net Core Web 应用程序,以替换项目管理 SQL Server 数据库的旧版 Access ADP/ADE 前端。然而,原始数据库的构建者并没有设置大量外键关系,而是在 SQL 视图中完成这一切。我希望通过这个应用程序来解决一些问题。

当外键属于同一类类型时,我想确保我全神贯注于设置外键。例如,我有以下课程。

项目.cs

using System;
using System.Collections.Generic;

namespace ProjectLogic.Models
{
    public class Project
    {
        public int Id { get; set; };
        public string Name { get; set; }
        public int? PmEmployeeId { get; set; }
        public int? CadEmployeeId { get; set; }
        public int? SalesRepEmployeeId { get; set; }
        ...
    }
}

员工.cs

using System;
using System.Collections.Generic;

namespace ProjectLogic.Models
{
    public class Employee
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Title { get; set; }
        ...
    }
}

项目课程结束时我的钥匙会像这样吗?

public Employee PmEmployee { get; set; }
public Employee CadEmployee { get; set; }
public Employee SalesRepEmployee { get; set; }

在 Employee 类中有相应的声明

public ICollection<Project> Projects { get; set; }

以及我的 DbContext 类中的模型生成器

modelBuilder.Entity<Project>(entity =>
{
// Fluent API for column properties
...
entity.HasOne(d => d.PmEmployee)
    .WithMany(p => p.Projects)
    .HasForeignKey(d => d.PmEmployeeId)
    .OnDelete(DeleteBehavior.SetNull)
    .HasConstraintName("FK_Project_Employee_PM");

entity.HasOne(d => d.CadEmployee)
    .WithMany(p => p.Projects)
    .HasForeignKey(d => d.CadEmployeeId)
    .OnDelete(DeleteBehavior.SetNull)
    .HasConstraintName("FK_Project_Employee_CAD");

entity.HasOne(d => d.SalesRepEmployee)
    .WithMany(p => p.Projects)
    .HasForeignKey(d => d.SalesRepEmployeeId)
    .OnDelete(DeleteBehavior.SetNull)
    .HasConstraintName("FK_Project_Employee_SALES");
});

我想我最大的担忧/问题是 Employee 类将如何处理与 Project 类的多种关系。我是否也需要单独处理这些public ICollection<Project> PmProjects { get; set; }?


是的,您需要有单独的项目集合。

在员工中,您将拥有:

public ICollection<Project> PmProjects { get; set; }
public ICollection<Project> CadProjects { get; set; }
public ICollection<Project> SalesProjects { get; set; }

在项目中,您将拥有:

public Employee PmEmployee { get; set; }
public Employee CadEmployee { get; set; }
public Employee SalesRepEmployee { get; set; }

建造者将是:

modelBuilder.Entity<Project>(entity =>
{
// Fluent API for column properties
...
entity.HasOne(d => d.PmEmployee)
    .WithMany(p => p.PmProjects)
    .HasForeignKey(d => d.PmEmployeeId)
    .OnDelete(DeleteBehavior.SetNull)
    .HasConstraintName("FK_Project_Employee_PM");

entity.HasOne(d => d.CadEmployee)
    .WithMany(p => p.CadProjects)
    .HasForeignKey(d => d.CadEmployeeId)
    .OnDelete(DeleteBehavior.SetNull)
    .HasConstraintName("FK_Project_Employee_CAD");

 entity.HasOne(d => d.SalesRepEmployee)
    .WithMany(p => p.SalesProjects)
    .HasForeignKey(d => d.SalesRepEmployeeId)
    .OnDelete(DeleteBehavior.SetNull)
    .HasConstraintName("FK_Project_Employee_SALES");
 });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在.Net Core / EF Core中设置同一类的多个外键 的相关文章

  • 在派生虚函数中强制执行正确的参数类型

    我发现很难非常简洁地描述这个问题 所以我附上了演示程序的代码 总的想法是 我们需要一组派生类 它们被迫从基类实现一些抽象 Foo 函数 每个派生的 Foo 调用都必须接受不同的参数作为输入 但所有参数也应该从 BaseInput 类派生 到
  • TortoiseGit / Winforms:合并时解析 Resource.resx

    我对 TortoiseGit 还很陌生 想知道如果 resx 文件发生冲突 如何在合并过程中解决它 例如 我可以从菜单中选择 使用他们的 尝试进行拉动和推动 但这是正确的方法吗 我可以以某种方式使用他们的并通过我的项目更改重建它吗 差异 以
  • 如何从我的应用程序在用户默认浏览器中启动 URL?

    如何在桌面应用程序中添加一个按钮 使用户的默认浏览器启动并显示应用程序逻辑提供的 URL Process Start http www google com
  • 在 C++ 中访问静态类变量?

    复制 C 对静态类成员的未定义引用 https stackoverflow com questions 272900 c undefined reference to static class member 如果我有这样的类 结构 head
  • 嵌入式Python,导入数学错误

    首先我使用的是 Mac OSX 10 12 6 我想在我的 C 应用程序中嵌入 python 环境 我把 github python 项目放在https github com python cpython https github com
  • 如何检测动态绘制图形的点击?

    我正在面板上绘制文件和文件夹名称列表 并试图集体讨论检测用户是否单击文件 文件夹名称以及何时单击文件 文件夹名称以及他们实际单击的文件或文件夹名称的最佳方法 以下是我迄今为止编写的方法 我的第一个想法是用透明控件搭载每段文本 并以这种方式动
  • 预期主表达式在“...”之前,C++ 编译错误

    SO 上有很多类似标题的帖子 但它们似乎是由各种语法错误触发的 而且我还没有看到一致的模式 using namespace std class A public A int a a a int a int main A x 3 A y 0
  • 仅标头模板的显式实例化声明(外部模板)

    我正在尝试加快 GLM OpenGL 数学 的编译时间 GLM 大量使用 C 模板 这是我到目前为止所尝试过的 math h pragma once include
  • 测试用户输入数组中的重复项的最有效方法是什么?

    我正在尝试编写一个模拟器来玩强力球彩票 程序会要求5数字 又名白球 并输入到6元素数组和另一个数字 红色强力球 放入6th 元素 我需要弄清楚如何首先测试重复项5元素但6th 不需要是唯一的 我有一个循环 我认为可以工作 但它甚至不执行并且
  • C# 中的新类型定义

    我正在寻找定义新类型并在 C 中使用它的可能性 如下所示 类定义 public class Position public double180 Longitude get set double180 is a type within a r
  • EditorFor/CheckBoxFor boolean 将 data-val-required 属性添加到 HTML,而不将 required 属性添加到模型

    我的模型类有一个没有必需属性的 bool 属性 public class Test public bool TestBool1 get set 然后在我的剃刀视图中 我使用 EditorFor CheckBoxFor 也会发生同样的情况 d
  • 基本镜面着色

    我正在使用一个生成阴影球体的简单代码 我还没有完全理解数学 但我在玩代码时正在弄清楚它 我想知道如何根据这段代码实现镜面反射着色 有什么建议么 for y 0 y
  • 如何将编译的正则表达式(std::regex)保存/序列化到文件?

    我在用着
  • 在 Xamarin.Forms 中添加方向更改布局

    我需要实现的是 在将屏幕从纵向更改为横向时向现有页面添加布局 我已经成功地使用检测方向变化void OnSizeAllocation 双倍宽度 双倍高度 但我无法为此事件添加布局 我的示例 C 代码是 public class MyLayo
  • 使用Swashbuckle ISchemaFilter设置输入参数的默认描述

    我想在文档架构中为所有具有 DateTime 类型的输入参数添加默认描述 这样客户就会了解我们正在使用哪些格式等 我可以为此目的创建 ISchemaFilter 的自定义实现吗 我知道我可以使用 xml 注释添加描述 但在这种情况下 我应该
  • 鱼眼图像不失真的正确方法

    我已经完成了一些示例程序 可以消除棋盘上的镜头失真 如鱼眼图像 并且工作正常 这是屏幕截图 接下来 我想使用鱼眼棋盘图案 上右图 来消除相同的镜头畸变 但从真实图像中去除 但没有运气 曲率仍然保留在未畸变的图像上 因此我得到了这个 the
  • 如何使信号客户端避免表单身份验证?

    我的 MVC 网站在 web config 中有表单授权 现在所有的页面都需要通过授权才能被查看 但是现在我有一个控制台程序 C 控制台程序 这个程序需要发送一些消息到 SignalR 集线器 但是我的 signalR Hub 在我的 MV
  • 如何通过参数包传递引用?

    我有以下代码 include
  • 基于路由参数的子容器注册

    我们有一个多租户 ASP NET MVC 应用程序 为多个客户端托管预订引擎 这些客户端中的每一个都有多个可以影响 Unity 容器配置的包 我们为每个请求创建一个子容器 并根据通过路由传递的客户端和包参数注册不同的接口实现 目前 我们正在
  • 获取非通用任务的结果

    有没有办法得到结果Task

随机推荐

  • Azure 资源模板依赖项/Application Insights

    我在将带有 Web 应用程序的 Application Insights 部署到 Azure 时遇到先有鸡还是先有蛋的问题 在 ARM 模板中 Application Insights 模块依赖于应用程序 ID 的网站 请参阅下面的 ARM
  • 不支持带有第二个索引的 ORDER BY

    我正在使用 cassandra 2 1 和最新的 CQL 这是我的表和索引 CREATE TABLE mydata chats new id bigint adid bigint fromdemail text fromemail text
  • 寻找Java拼写检查库[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找一个开源 Jav
  • 将 Julia 数组转换为数据帧

    我有一个数组 X 我想将其转换为数据帧 根据网络的推荐 我尝试转换为数据帧并收到以下错误 julia gt y convert DataFrame x ERROR converthas no method matching convert
  • 使用gson反序列化json字符串

    我的 java servlet 以这种方式返回 json 字符串 Gson gson new Gson String lista gson toJson utenti System out println lista request set
  • Android Asynctask处理实时视频帧

    我正在使用 OpenCV 尝试进行一些实时视频处理 由于处理相当繁重 它会显着延迟输出帧 使实时流看起来不稳定 我想将一些处理卸载到 AsyncTask 中 我已经尝试过 它实际上使视频更加流畅 然而 它最终会立即启动大量任务 然后它们会慢
  • Asp.Net Core 中使用 POST 方法重定向到 URL

    我有简单的网址重写器 private static void RedirectToAPI RewriteContext context var request context HttpContext Request if request P
  • 从 MKMapView 找出您所在的区域类型

    有什么方法可以从 MKMapView 确定您所在的区域类型吗 IE 如果地图的中心位于海洋中 我们可以告诉用户 地图的中心位于海洋上方 或者如果地图的中心位于绿色区域上方 地图的中心位于公园上方 我能想到的唯一方法是创建可见屏幕的屏幕截图并
  • 如何使 Typescript 与 SystemJS 和 Angular 一起使用成为可能?

    我试图让 SystemJS 与 Typescript 一起工作 但它们似乎相互冲突 如何利用 System js 的自动加载而不与 Typescript 上的关键字冲突 使用 import require 使得 Typescript 使用它
  • 无法在 IronPython 中使用日期时间

    我将 IronPython 托管在 C Web 应用程序中 如下所示 var engine Python CreateEngine var scope engine CreateScope var script Engine CreateS
  • Composer:如何在 Symfony 2.3 中安装 `dev` 包?

    正在尝试安装KnpGaufrette捆绑包在 Symfony 2 3 项目中 我没有运气 问题是 minimum stability stable in composer json 我需要的包是dev master版本依旧 Reading
  • C# 编译器中的 Duck 类型

    Note这是not关于如何在 C 中实现或模拟鸭子类型的问题 多年来 我一直认为某些 C 语言功能依赖于语言本身定义的数据结构 对我来说 这总是像一个奇怪的先有鸡还是先有蛋的情况 例如 我的印象是foreach循环只能与实现的类型一起使用I
  • UIStackView:从 xib 加载视图并更新子视图的高度约束没有反映任何更改?

    我的应用程序中有以下层次结构 UIScrollView UIStackView UIView 1 load with xib and added in arrangedSubviews UIScrollView 1 1 horizontal
  • 获取 Tkinter Text 小部件中的总行数?

    我有一个 TkinterText小部件 我想知道它包含多少行 我知道的text cget height 方法 但是这只告诉我显示了多少行 我想知道总共有多少行 我正在使用此信息来尝试制作自己的自定义滚动条 因此我们将不胜感激 Use the
  • cx_Oracle.DatabaseError: ORA-12514: TNS:listener 当前不知道连接描述符中请求的服务

    我正在尝试对新安装的系统进行健全性测试Oracle client 12 2 in RHEL 7 linux来自Python程序 但它因上述错误而失败 不确定我在那里缺少什么 请帮忙解决这个案例 cx Oracle DatabaseError
  • Double.parseDouble 和 Integer.parseInt 之间的行为差​​异[重复]

    这个问题在这里已经有答案了 似乎 parseDouble 可以接受带有尾随空格的字符串 但 parseInt 和 parseLong 会抛出异常 例如对于这个测试用例 Test public void testNumberParsing t
  • 正则表达式搜索非常大的文件

    我需要使用正则表达式扫描 300MB 的文本文件 读取整个文件并将其放入变量中会占用超过 700MB 的 RAM 然后会失败并出现 无法分配内存 错误 匹配可以是两行或三行 所以我不能在循环中使用行到行步进 是否有任何惰性方法可以使用正则表
  • WCF maxConnections 属性

    我有一个用 net 4 编写的 WCF 服务 并通过 net tcp 公开 每当我尝试将绑定配置的 MaxConnections 属性设置为高于 10 的值时 我都会遇到 AddressAlreadyInUseException 为什么会在
  • 使用 Secrets 密码时无法连接到 Kubernetes 中的 mysql pod(访问被拒绝)

    我尝试在 Kubernetes 中设置 mysql 数据库 我配置了一个 ConfigMap 来存储数据库名称和一个包含 root 密码 用户和用户密码的 Secret 当我随后尝试连接到数据库时 在容器内使用 mysql cli 从外部使
  • 在.Net Core / EF Core中设置同一类的多个外键

    我正在构建一个 Net Core Web 应用程序 以替换项目管理 SQL Server 数据库的旧版 Access ADP ADE 前端 然而 原始数据库的构建者并没有设置大量外键关系 而是在 SQL 视图中完成这一切 我希望通过这个应用