【问题标题】:Entity Framework Code First Foreign Key adding Index as well实体框架代码优先外键添加索引
【发布时间】:2015-04-18 03:04:41
【问题描述】:

我在 EF 6 代码优先中使用简单的外键定义了简单的表。

public class Address
{
        /// <summary>
        /// Gets or sets the id.
        /// </summary>
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        [Column(Order = 1)]
        public int Id { get; set; }

         /// <summary>
        /// Gets or sets the town.
        /// </summary>
        public virtual Town Town { get; set; }

        /// <summary>
        /// Gets or sets the paf address town id.
        /// </summary>
        [Column(Order = 2)]
        public int TownId { get; set; }
}

创建表时,它会创建外键和索引。我想知道为什么,因为这样的索引通常效率很低,而且对于大型数据库来说会引起很多问题。那么为什么它只创建该索引而不是外键。以及如何默认禁用此类索引创建。

【问题讨论】:

  • 我不同意:对于 SQL Server,外键列上的索引是一种非常有效 加快 JOIN 和查找速度的方法!这是我通常在 any 外键列上推荐的东西!
  • 好吧,也许我效率的问题我错了,但是我还是不明白为什么要加,我们可以在EF CF中显式的加索引。那么为什么默认添加它以及如何防止这种行为呢?我知道如何使用迁移来解决这个问题,但我只是好奇。
  • @Marcin 是的,您可以通过使用数据库迁移自己控制索引。您可能还可以删除执行此行为的约定,但我对此并不积极。

标签: c# entity-framework ef-code-first


【解决方案1】:

这只是实体框架的约定。如果您不喜欢它,那么您可以在您的项目上启用迁移并将迁移更改为不包含外键。不过,我不同意你关于效率低下的说法。

要启用数据库迁移,请执行以下操作:

  1. 在包管理器控制台中,键入Enable-Migrations
  2. 在包管理器控制台中,键入Add-Migration InitialMigration
  3. 一个新的迁移将被添加到 Migrations 文件夹中,您将在其中看到一个带有一些语句的 Up 方法。找到添加外键的行并将其删除。
  4. 在包管理器控制台中,键入 Update-Database 以应用迁移。
  5. 对出现的任何新更改重复第 2-4 步。

这是假设您还没有数据库并且正在从头开始。

【讨论】:

  • 谢谢,这就是我所做的,以防止这种情况发生。只是好奇为什么会这样。
  • 我假设他们这样做是为了随着数据库的增长,跨这些关系的任何连接都会很快。在小型数据库中,这可能有点矫枉过正,但是当您添加大量数据时,索引将很有用。对于小型数据库来说这可能是一种浪费,但是当你拥有这么少的表时,性能对于任何表来说都不是真正的问题。
  • 我会接受这个答案,也许会对某人有所帮助
  • 还有其他选择吗,因为我已经创建了数据库并且还有很多表。手动执行此操作将花费大量时间。有没有其他方法可以做同样的事情?
猜你喜欢
  • 2011-08-05
  • 2012-05-10
  • 2015-02-24
  • 2021-01-05
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多