EF Core:在同一表中的项目之间创建链接

2024-02-18

假设我有一个公司列表:

Company CompanyID
CompanyA 1
CompanyB 2
CompanyC 3
CompanyD 4

假设我们想展示这一点CompanyA是的竞争对手CompanyB and CompanyC但不是CompanyD.

我想使用 EF Core 建立这样的链接/映射。我假设我需要创建一个映射表,在数据库中将如下所示:

竞争对手地图:

CompanyId CompetitorCompanyID
1 2
1 3

我正在努力解决的是如何在OnModelCreating(ModelBuilder modelBuilder) method?

我已经能够在两个不同表中的实体之间创建映射,但无法配置DBContext此用例的类(其中映射的实体位于同一个表中)。


如果是我的话我会这样做

公司模式

public class Company
{
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<CompanyCompetitorRelation> CompanyRelation { get; set; }
    public virtual ICollection<CompanyCompetitorRelation> CompetitorRelation { get; set; }
}

在这个模型中,我说它与 CompanyCompetiorRelation 模型有 2 个关系。

现在为公司竞争对手关系模型

public class CompanyCompetitorRelation
{
    public int CompanyId { get; set; }
    public int CompetitorId { get; set; }
    public virtual Company CompanyRelation { get; set; }
    public virtual Company CompetitorRelation { get; set; }
}

现在,我想说的是 CompanyCompetiorRelation 与公司模型有 2 个关系。

现在 Fluent API 的魔力将发挥作用

protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Company>()
        .HasKey(e => e.Id);

    builder.Entity<CompanyCompetitorRelation>()
        .HasKey(e => new { e.CompanyId, e.CompetitorId });

    builder.Entity<CompanyCompetitorRelation>()
        // CompanyCompetitorRelation property
        .HasOne(e => e.CompanyRelation)
        // Company property
        .WithMany(e => e.CompanyRelation) 
        // Set the property that is FK for this relation
        .HasForeignKey(e => e.CompanyId); 

    builder.Entity<CompanyCompetitorRelation>()
        // CompanyCompetitorRelation property
        .HasOne(e => e.CompetitorRelation) 
        // Company property
        .WithMany(e => e.CompetitorRelation) 
        // Set the property that is FK for this relation
        .HasForeignKey(e => e.CompetitorId); 
}

在第一组FK上builder.Entity<CompanyCompetitorRelation>()我是说它与许多公司都有一个 CompanyRelation,并且外键是 CompanyId

在第二组FK上builder.Entity<CompanyCompetitorRelation>()我是说它作为与许多公司的一种 CompetitorRelation 关系,并且外键是 CompetitorId

这是它生成的

migrationBuilder.CreateTable(
name: "Company",
columns: table => new
{
    Id = table.Column<int>(type: "int", nullable: false)
        .Annotation("SqlServer:Identity", "1, 1"),
    Name = table.Column<string>(type: "nvarchar(max)", nullable: true)
},
constraints: table =>
{
    table.PrimaryKey("PK_Company", x => x.Id);
});

migrationBuilder.CreateTable(
    name: "CompanyCompetitorRelation",
    columns: table => new
    {
        CompanyId = table.Column<int>(type: "int", nullable: false),
        CompetitorId = table.Column<int>(type: "int", nullable: false)
    },
    constraints: table =>
    {
        table.PrimaryKey("PK_CompanyCompetitorRelation", x => new { x.CompanyId, x.CompetitorId });
        table.ForeignKey(
            name: "FK_CompanyCompetitorRelation_Company_CompanyId",
            column: x => x.CompanyId,
            principalTable: "Company",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
        table.ForeignKey(
            name: "FK_CompanyCompetitorRelation_Company_CompetitorId",
            column: x => x.CompetitorId,
            principalTable: "Company",
            principalColumn: "Id",
            onDelete: ReferentialAction.Cascade);
    });

migrationBuilder.CreateIndex(
    name: "IX_CompanyCompetitorRelation_CompetitorId",
    table: "CompanyCompetitorRelation",
    column: "CompetitorId");

希望这有助于理解

如果需要,您可以创建任意数量的内容,只需在 Fluent API 上将它们指向正确的方向即可

我认为在模型上也可以这样做,但我喜欢使用 FluentAPI

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

EF Core:在同一表中的项目之间创建链接 的相关文章

  • 自定义 Sql Server 对象资源管理器右键单击菜单项

    如何在 Sql Server 2012 的对象资源管理器中添加或自定义右键菜单项 例如 我想将新项目添加到表右键菜单中以生成自定义表创建器脚本 您可以编写一个 SSMS 加载项 See http sqlblogcasts com blogs
  • C++ 编译器可以对结构中的元素重新排序吗

    C 编译器 特别是 g 可以对结构体的内部元素重新排序吗 我看到一些奇怪的行为 其中我有一个包含如下内容的结构 Struct SomeStruct long someLong long someLongArray 25 unsigned l
  • 轮廓积分算法 C++

    我正在尝试编写一个应用数学程序来计算复平面中的轮廓积分 对于初学者来说 我想为梯形方法编写一个算法 但我有点坚持理解它会是什么样子 毕竟 我们通常将梯形方法视为 2D 图 而这里我们有 f C gt C 所以我们谈论的是 4D 最终我希望用
  • 类型定义存在于两个库中

    我正在使用 NET 4 5 构建 ASP NET Web 窗体网站 错误 The type System ComponentModel DataAnnotations Schema ForeignKeyAttribute exists in
  • 在 C++ 中从另一个数组初始化结构内的数组[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions struc
  • 可以轻易移动,但不可轻易复制

    是否可以创建类类型 即 普通移动构造 但不是普通复制构造 但仍然可复制构造 普通复制构造 但不是普通移动构造 但仍然可移动构造 可以简单地复制分配 但不能简单地移动分配 但仍然可以移动分配 可以简单地移动分配 但不能简单地复制分配 但仍然可
  • System.NotSupportedException:“集合是只读的。”从 iList 中删除对象时抛出

    运行下面的代码片段时抛出异常 我有一个 iListof webelements 如果该元素包含字符串 WSC 我想将其从 iList 中删除 谁能帮我吗 代码如下 IList
  • 用于选择项目/属性列表中具有多个属性的项目的 SQL 语句是什么?

    假设我有一个表 其中列出的项目和属性如下 frog green cat furry frog nice cat 4 legs frog 4 legs 我想从项目列中选择同时具有绿色和 4 条腿属性的唯一对象 在这种情况下 我希望只返回青蛙对
  • std::make_shared 作为默认参数无法编译

    在 Visual C 2008 和 2010 中 以下代码无法编译并出现以下错误 include
  • 需要帮助将 winform 迁移到 net 5

    我正在将 winform 应用程序从 net core 3 1 移植到 net 5 并收到以下错误 严重性代码 说明 项目文件行抑制状态 错误NETSDK1136 目标平台必须设置为Windows 通常 通过在 TargetFramewor
  • 在浏览器中测试wcf服务

    我无法在浏览器中调用基本的 wcf web 方法 即使使用
  • 向量和常量

    考虑一下这个 void f vector
  • 如何在 ASP.NET MVC 中获取参数数组作为 GET / POST?

    如何最好地获取数组 item gt value 对作为 GET POST 参数 在 PHP 中 我可以这样做 网址 这得到的参数为 Array a gt Array one gt 100 two gt 200 有什么方法可以在 ASP NE
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 对嵌套属性使用 XmlAttributeOverrides

    我试图使用 XmlAttributeOverrides 来控制类序列化后哪些类属性出现在 xml 中 它适用于 根 类上的属性 但不适用于嵌套属性 这是一个简单的例子来说明我想要完成的任务 我的类层次结构如下 public class Ma
  • 如何在 OpenCV 中删除 mouseCallback

    在使用 C 的 OpenCV 中 有没有办法删除 mouseHandler int event int x int y int flags void param 通过函数添加到窗口 image window cv setMouseCallb
  • System.IndexOutOfRangeException:索引超出了数组的范围[重复]

    这个问题在这里已经有答案了 我正在开发一个 ATM 软件作为家庭作业 我想知道今天处理的交易总量 为此我编写了以下代码 public decimal getDayTransaction int accountid string date s
  • 为什么 istream/ostream 慢

    于 50 40http channel9 msdn com Events GoingNative 2013 Writing Quick Code in Cpp Quickly http channel9 msdn com Events Go
  • C++ 从文件中读取字符串

    我试图将字符串直接存储到一个文件中 以便稍后在 C 中读取 基本上 对于整个范围 我试图将带有字符串变量的对象数组存储在文件中 并且这些字符串变量将通过类似 object 的内容读取 0 字符串 然而 每次我尝试读取字符串变量时 系统都会给
  • 文件按文件名模式存在

    我在用 File Exists filepath 我想做的是将其替换为模式 因为文件名的第一部分发生了变化 例如 该文件可以是 01 peach xml 02 peach xml 03 peach xml 如何根据某种搜索模式检查文件是否存

随机推荐

  • XmlSerializer 更改编码

    我正在使用这段代码Serialize XML to String XmlWriterSettings xmlWriterSettings new XmlWriterSettings indent true Encoding Encoding
  • emacs 创建键修饰符

    我在 mac 操作系统上使用 emacs 我想将修饰符 Meta Control 映射到一个简单的键 基本上这就是我需要的 global set key kbd a hyper 这里 a 只是 a 键 没有 Control a 或其他什么
  • 用C解析CSV文件[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一个库可以用来解析 C 中的 CSV 文件 我在 Linux 系统上 我知道关于this http
  • 我需要为 NSObject 调用 [super init] 或 [super initWithCoder] 等

    通常当我从UIclass I 将调用感兴趣的超类初始值设定项 但是 我不确定实施细节NSObject 似乎在成员变量方面没有太多进展 所以我想知道 我需要打电话吗 super init 如果我的子类扩展NSObject 从技术上来说 不 这
  • 如何捕获 Python Unittest 测试用例失败的屏幕截图

    我使用 Python 3 6 5 和以下库 Appium Python 客户端 0 26 单元测试2 1 1 0 硒 3 5 0 pytest 3 6 3 现在我需要截图以防测试失败 所以我故意做了一个错误的陈述self driver fi
  • 无法理解使用 Eclipse 的 Maven pom 文件

    I am very new to Maven and i am creating my first maven project of maven archetype quickstart 然后它会生成错误消息 但在我的项目资源管理器中 我无
  • SICP中的图片语言如何使用框架?

    我似乎无法理解 SICP 中框架的实现 书中指出 我们将使用单位正方形中的坐标 0 图像如何表示为坐标 我能想到的唯一解释是 所有图像 都是线条 只能映射到一个框架 该框架的边界不能超过单位正方形的边界 但我对此表示怀疑 因为书中的下一行解
  • 如何在 Objective C 中打印出 bool

    我在 NSUserDefault 中为关键 TCshow 设置了一个 bool 值 我想运行 nslog 测试密钥是否已保存 并且我正在尝试打印布尔值 这是我的代码 但它不起作用 有什么建议吗 IBAction acceptAction i
  • 创建 T4 生成类型的泛型 List

    我使用 T4 技术创建了简单的类 lt template debug false hostspecific false language C gt lt output extension cs gt using System lt var
  • 我可以在 Android 应用程序类中创建自定义全局方法吗?

    我目前有一个具有许多活动的应用程序 需要有一种方法来维护这些活动之间的状态 我使用 Application 类来执行此操作 声明全局变量并使用 getter 和 setter 与我的活动进行交互 我希望在那里放置一些自定义方法 以便当我想要
  • 如何将文件路径变量传递给 mex 命令?

    目前正在尝试创建脚本化 mex 文件生成的最小示例 我有一个 MATLAB m 脚本 正在运行它来生成 mex 文件 我想将所有参数作为变量传递 以便在给定文件名 路径列表时自动构建一堆 mex 文件 1 unknown argument
  • AngularJs:ng-if 内的表单无法从控制器访问

    我里面有一个表格ng if指示 我想使用检查控制器中的表单验证 valid div div
  • Android 错误跟踪器在哪里? (Android Google Code 项目除外)

    为了解决 Android 上的问题 我已经到达这个差异 https android googlesource com platform frameworks base ed4f28b492da3ff140bbaabbbda798a08c40
  • TensorFlow/Keras 使用特定类召回作为稀疏分类交叉熵的度量

    更新在底部 我尝试使用 3 个类别中的 2 个类别的召回率作为指标 即 A B C 类中的 B 类和 C 类 其本质是我的模型在类别中高度不平衡 90 是A类 因此当我使用准确度时 每次预测A类时我都会得到 90 的结果 model com
  • 用逗号将一个字符串拆分为几列

    例如 我有下表 Block abcdefgh 12kjkjkj 231wewoxyz 我怎样才能将它转换成 Block1 Block2 Block3 abcdefgh 12kjkjkj 231wewoxyz Note 每个 块 最多有 8
  • 如何配置 jest 使用的 jsdom 实例?

    我遇到过这个问题在玩笑测试用例中需要 systemjs 时抛出无效 URL https github com systemjs systemjs issues 840 最后的评论之一建议 通过在 jsdom 中设置引荐来源网址配置来操纵 j
  • 更改 iPython 笔记本 Markdown 单元格中的字体

    我只是想将 Ipython 1 0 0 笔记本 Markdown 单元中的默认字体更改为其他内容 并尝试使用 Markdown 单元中的样式标签来执行此操作 而不是通过创建 custom css 的路径 我不懂 CSS 而且我的需求也很少
  • XML 架构参考

    我有两个 XML 模式 第一的 A xsd 位于库 jar 文件中 mylib jar 和第二个 B xsd 在我的项目中 我想进口A xsd进入B xsd并通过以下方式验证传入的 XMLJaxb2Marshaller嵌入式验证器 但是我无
  • Firebase populateViewHolder 永远不会被调用

    我的 firebase 控制台中有以下结构 我正在尝试读取值并显示所有用户 但 populateViewHolder 永远不会被调用 users OW5BYennVRXvfzOjfKpup9rZEYv2 email email protec
  • EF Core:在同一表中的项目之间创建链接

    假设我有一个公司列表 Company CompanyID CompanyA 1 CompanyB 2 CompanyC 3 CompanyD 4 假设我们想展示这一点CompanyA是的竞争对手CompanyB and CompanyC但不