多对多索引创建约定

2024-02-16

我的问题与这个帖子 https://stackoverflow.com/questions/48645872/prevent-index-created-by-convention-on-many-to-many-table,但我不想阻止,而是想了解创建索引的约定是什么,因为我找不到任何东西。

给定实体:

public class Entity1
{
  public Guid Id {get;set;}
  public string Name {get;set;}
  public ICollection<Entity1Entity2Link> Links {get;set;}
}

public class Entity2
{
  public Guid Id {get;set;}
  public string Name {get;set;}
  public ICollection<Entity1Entity2Link> Links {get;set;}
}

public class Entity1Entity2Link
{
  public Guid Entity1Id {get;set;}
  public Entity1 Entity1 {get;set;}

  public Guid Entity2Id {get;set;}
  public Entity2 Entity2 {get;set;}
}

以及多对多关系设置:

modelBuilder
                .Entity<Entity1Entity2Link>()
                .HasKey(ofl => new
                {
                    ofl.Entity1Id ,
                    ofl.Entity2Id 
                });

            modelBuilder
                .Entity<Entity1Entity2Link>()
                .HasOne(ofl => ofl.Entity1)
                .WithMany(e => e.Links)
                .HasForeignKey(ofl => ofl.Entity1Id);

            modelBuilder
                .Entity<Entity1Entity2Link>()
                .HasOne(ofl => ofl.Entity2)
                .WithMany(e => e.Links)
                .HasForeignKey(ofl => ofl.Entity2Id);

生成的迁移在 Entity2Id 上有索引

// create table etc...

migrationBuilder.CreateIndex(
    name: "IX_Entity1Entity2Link_Entity2Id",
    table: "Entity1Entity2Link",
    column: "Entity2Id");

我正在寻找创建此索引的约定是什么?我能找到的一项公约规定:

EF Core 将始终为外键和备用键创建索引。

但为什么我没有看到另一个索引Entity1Id柱子 ?

我还注意到我可以通过交换复合键定义中的列来交换在列上创建的索引,例如

modelBuilder
    .Entity<Entity1Entity2Link>()
    .HasKey(ofl => new
    {
        ofl.Entity2Id,
        ofl.Entity1Id
    });

这将创建一个索引Entity1Id column:

migrationBuilder.CreateIndex(
    name: "IX_Entity1Entity2Link_Entity1Id",
    table: "Entity1Entity2Link",
    column: "Entity1Id");

我正在使用 EF Core 3.1.2。

<PackageReference Include="Microsoft.EntityFrameworkCore" Version="3.1.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="3.1.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.1.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.2" />

基本上就是你提到的

按照约定,在用作外键的每个属性(或属性集)中创建索引。

除一个例外,以下摘录部分涵盖综合指数 https://learn.microsoft.com/en-us/ef/core/modeling/indexes?tabs=data-annotations#composite-index部分:

多列索引(也称为复合索引)可以加快对索引列进行筛选的查询的速度,而且还可以加快仅对索引列进行筛选的查询的速度。first索引覆盖的列。

因此,按照惯例,索引会自动为所有 FK 创建,except如果 FK 属性是leading其他一些复合索引中的列。由于复合索引的前导列提供与包含这些列的单独索引相同的高效搜索能力,因此单独索引是多余的,并且 EF Core 足够聪明,不会创建它。

在您的示例中,已经存在与 PK 关联的复合索引(Entity1Id, Entity2Id)列,涵盖Entity1IdFK,因此不会创建额外的索引。如果你交换 PK 中的列,那么Entity2Id将被覆盖,因此只需附加索引Entity1IdFK 将被创建。

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

多对多索引创建约定 的相关文章

随机推荐

  • 如何检查 Star Basic 中损坏的内部链接?

    我正在为 LibreOffice Writer 创建一个基本宏来检查损坏的内部链接 简而言之 生成所有锚点的列表 循环浏览文档 查找内部超链接 如果内部超链接不在锚点列表中 则打开它进行编辑 然后停止 我的代码有一些未解决的问题 withi
  • 语句包含 OUTPUT 子句但没有 INTO 子句错误

    我有一个触发器 它使用同一插入记录的身份主键 MessageId 的值更新插入的字段 RootId 之一 仅当插入记录的 RootId 字段为 0 时才应进行更新 触发器看起来像这样 ALTER TRIGGER dbo Trigger Ro
  • Google App Engine 应用程序可能消耗的最大内存是多少?

    最大金额是多少local记忆 notMemcache Google App 引擎应用程序的每个实例都可以使用吗 我找不到任何关于GAE 配额页面 http code google com appengine docs quotas html
  • Linq to SQL - 基础列长度

    我使用 Linq to SQL 一段时间了 我发现它非常有用且易于使用 对于我过去使用过的其他 ORM 工具 从数据库填充的实体对象通常有一个属性 指示数据库中基础数据列的长度 这在数据绑定情况下非常有用 例如 您可以在文本框上设置 Max
  • 如果我单击一个单元格,则需要在 Gsheet 中捕获电子邮件或姓名

    如果有人单击 Ay 列复选框 则需要在不同的列单元格中捕获他 她的电子邮件 您并不总是能够访问用户 唯一可以在单击上工作的触发器是 onSelectionChange 这是一个简单的触发器 这意味着它不能执行任何需要权限的操作 而 Sess
  • 如何创建空列表的列表

    如果之前已经回答过这个问题 我深表歉意 但我在这里找不到类似的问题 我对 Python 还很陌生 我想要创建的内容如下 list1 list2 results list1 list2 这段代码工作得非常好 但我想知道是否有一种更快的方法可以
  • 快速算法,精确查找二元矩阵中的 k 列,使这些列的总和为 1-向量

    假设我有一个 M x N 二进制矩阵 其中 M 和 N 都可以很大 我想精确地找到 k 列 k 相对较小 比如小于 10 这样这 k 列的总和就是 1 向量 所有元素均为 1 一种解决方案就足够了 有没有快速的算法 例如 处理矩阵的算法 1
  • 中心引导程序的品牌和列表项

    关于将 Twitter bootstrap 的品牌居中或将导航栏中的列表项居中存在几个问题 但我还没有弄清楚如何将两者居中 这是一个例子 用于修改twitter bootstrap导航栏 https stackoverflow com qu
  • 错误:日期/时间字段值超出范围:“30/12/2014 23:58:04”postgresql

    我正在尝试将 csv 文件导入 postgresql 数据库 我已经尝试过了set datestyle mdy copy Recon snapdeal sales REFERENCES ORDER CODE SUB ORDER CODE P
  • 如何在 pageInfo 中将总计数传递给客户端

    I use first after and last before进行分页 hasNextPage and hasPreviousPage非常有用 但我还需要的是total count这样我就可以计算并显示诸如page 5 of 343 p
  • 防止 ASP.Net 中的 SQL 注入

    我有这个代码 UPDATE OPENQUERY db SELECT FROM table WHERE ref Ref AND bookno Session number 我该如何防止 SQL 注入呢 UPDATE 这就是我正在尝试的 Sql
  • 错误:req.flash() 需要会话

    我是节点新手 我很确定我已经设置了中间件并表示使用闪存消息传递 但是我仍然收到错误 Error req flash requires sessions Setup express js var flash require connect f
  • 在子窗口上绑定 jQuery 事件

    我有一个包含以下 JavaScript 的页面 var w window open somePage html width 500 height 500 w bind someEvent function alert I see the e
  • MinGW:使用 __declspec(dllexport) 还是 __attribute__((visibility("default")))?

    MinGW支持吗 declspec dllexport declspec dllimport 即使是这样 我应该使用 attribute visibility default 基本上我应该根据平台或编译器来决定使用什么 应该是这样吗 ifd
  • 未找到证书链

    我正在签署 jar 文件 由 VeriSign 提供的证书 它提供2个证书 aplha primary cer and aplha secoandary cer 我使用以下命令生成密钥库文件 keytool importcert v ali
  • 在我的应用程序中禁用多指触摸[重复]

    这个问题在这里已经有答案了 我的应用程序使用一个 Activity 来托管多个片段 每次在手机屏幕上显示一个片段 每个片段的视图由多个图像图标组成 目前 用户可以按两个图标同时地用两根手指 每根手指按一个图标 我想禁用此多点触控功能在我的应
  • 如何将一个组件服务响应传递给角度2中的其他组件

    我是角度 4 的新手 在一个组件中从服务器获取响应 并且我希望在其他组件中获取此响应对象如何访问 应用程序组件 ts export class AppComponent selected skipCount number 0 errorMe
  • 如何在3.0模拟器上正确运行应用程序?

    我从 SDK 3 1 和 OpenGL ES 模板创建了一个新项目 如您所知 这个新模板具有 ES 1 1 和 ES 2 0 实现 我想先处理 ES 1 1 部分 所以我将项目设置中的 Base SDK 更改为 Simulator 3 0
  • 创建一个在 R 中重复自身的向量

    我想创建一个重复自身的向量 例如 1 3 直至 12 行 1 2 3 1 2 3 1 2 3 1 2 3 我怎样才能在 R 中做到这一点 感谢您的帮助 See rep 你想要的很简单 gt rep 1 3 times 4 1 1 2 3 1
  • 多对多索引创建约定

    我的问题与这个帖子 https stackoverflow com questions 48645872 prevent index created by convention on many to many table 但我不想阻止 而是