Entity Framework Code First外键添加索引

8

我在 EF 6 的 Code-First 中有一张简单的表定义,其中包含简单的外键。

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; }
}

当创建表时,它会同时创建一个外键和索引。我想知道为什么会这样,因为这种索引通常非常低效,对于大型数据库来说会导致很多问题。那么为什么它创建了这个索引而不是只创建外键呢?如何默认禁用这样的索引创建。


6
我不太同意:对于SQL Server来说,在外键列上建立索引是加速JOIN和查找的非常有效的方法!这是我通常会建议在任何外键列上建立索引的事情! - marc_s
好的,也许我的效率观点有误,但我仍然不明白为什么它会默认添加索引,我们可以在EF CF显式地添加索引。那么为什么它会默认添加它,如何防止这种行为?我知道如何通过使用迁移来解决这个问题,但我只是好奇。 - Marcin
@Marcin 是的,你可以通过使用数据库迁移来自己控制索引。可能还有一些惯例可以去除这种行为,但我对这部分不确定。 - Dismissile
这是一个关于编程的问题,请参考这里 - StuartLC
1个回答

3
这只是一个Entity Framework的惯例。如果你不喜欢它,那么你可以在项目中启用迁移,并将迁移更改为不包括外键。我不同意你的说法,认为这种方法并不低效。
要启用数据库迁移,请执行以下步骤:
  1. 在程序包管理器控制台中,键入Enable-Migrations
  2. 在程序包管理器控制台中,键入Add-Migration InitialMigration
  3. 将添加一个新的迁移到Migrations文件夹中,在其中你会看到一个带有几个语句的Up方法。找到添加外键的行并将其删除。
  4. 在程序包管理器控制台中,键入Update-Database以应用迁移。
  5. 对于任何新的更改,重复步骤2-4。
这假设你还没有数据库,从头开始。

谢谢,这就是我所做的,以防止发生这种情况。只是好奇为什么会发生这种情况。 - Marcin
我认为他们这样做是为了在数据库增长时加快跨这些关系的任何连接。在小型数据库中,这可能有些过度,但当您添加大量数据时,索引将非常有用。对于小型数据库来说可能有些浪费,但当您拥有如此少的表格时,性能并不是真正的问题。 - Dismissile
我会接受这个答案,也许对某些人有帮助。 - Marcin
有没有其他选项,因为我已经创建了数据库并且有很多表格。手动完成这个任务需要很长时间。有没有其他方法来完成同样的事情? - Usman lqbal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接