【发布时间】:2022-04-15 14:08:58
【问题描述】:
正如Entity Framework Indexing ALL foreign key columns 等问题中所述,EF Core 似乎会自动为每个外键生成一个索引。这对我来说是一个合理的默认设置(我们不要在这里陷入舆论战......),但在某些情况下它只是浪费空间并减慢插入和更新速度。如何根据具体情况进行预防?
我不想完全关闭它,因为它利大于弊;我不想为我想要的所有索引手动配置它。我只想在特定 FK 上阻止它。
相关问题:EF 文档中是否提到了这些索引是自动创建的?我在任何地方都找不到它,这可能是我找不到如何禁用它的原因?
肯定有人会质疑我为什么要这样做......所以为了节省时间,链接问题的操作员在评论中给出了一个很好的例子:
例如,我们有一个
People表和一个Addresses表。这People.AddressIDFK 已被 EF 索引,但我只从 aPeople行并搜索Addresses记录;我从来没有找到一个Addresses行,然后在People.AddressID列中搜索 匹配记录。
【问题讨论】:
-
如果只是针对几个特定的表,难道你不能从你的迁移中删除添加索引的代码吗?
-
@Valuator 对不起,我迷路了。什么迁移?当我的应用程序启动时,它通过调用
db.Database.EnsureCreated();从头开始创建数据库。据我了解,索引的创建是在幕后自动发生的。这是 EF Core 2,顺便说一句。 -
好的,
EnsureCreated与 Migrations 不同,我自己从未使用过它,尽管我只知道两者不兼容。使用迁移,您可以在应用它们之前查看对数据库的基础更改。 -
此外,我建议阅读以下MS doc about EnsureCreated()。如果您有一些模型更改,它不会更新您的数据库 - 迁移会这样做。也很有趣(即使是 EF7)EF7 EnsureCreated vs. Migrate Methods。 Here 你可以找到所有支持方法的 EF 和 EF Core 教程。
-
@pbarranis 好的。好吧,我会使用迁移并自己管理索引,并且会删除不需要的索引。我希望能找到一个可以接受的答案,因为我也对它感兴趣。 :)
标签: entity-framework ef-core-2.0