Entity framework 实体框架在外键列上创建重复索引

Entity framework 实体框架在外键列上创建重复索引,entity-framework,foreign-keys,Entity Framework,Foreign Keys,EF代码中最简单的2表定义首先使用外键 public class Blog { [Key] public int BlogId { get; set; } public string Name { get; set; } public virtual List<Post> Posts { get; set; } } public class Post { [Key, Column(Order = 0)] public int Blo

EF代码中最简单的2表定义首先使用外键

public class Blog {
    [Key]
    public int BlogId { get; set; }
    public string Name { get; set; }

    public virtual List<Post> Posts { get; set; }
}

public class Post {
    [Key, Column(Order = 0)]
    public int BlogId { get; set; }

    [Key, Column(Order = 1)]
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public virtual Blog Blog { get; set; }
}
BlogId
是复合索引中维护主键的第一列,因此
IX_BlogId
是冗余的,永远不会被使用

创建它的目的是什么

讨论索引外键列时也有类似的问题,但不是冗余索引:


在国际海事组织,没有普遍的答案,即“视情况而定”。这应该是禁用索引创建的简单方法。

是的,它是主键的一部分。但是,在某些DBMS中,主键只是列上的唯一约束,并不一定意味着它也是列上的索引。请尝试进一步遵循您的逻辑:如果“DBMS主键只是列上的唯一约束,并不一定意味着它也是列上的索引”,而不是层,将CodeFirst转换为DBMS,创建索引以维护主键。因为它不这样做——它知道,MS SQL主键已经有索引了。也就是说,它知道外键列已经有了索引,但又创建了另一个“以防万一”的索引。实际上。。。不。事实并非如此。在MS SQL中,主键是唯一的ASC非聚集索引。但并非在所有的DBMS中。EF本身不会创建列描述中引用的约束尚未隐含的索引。IMO,默认情况下,MS SQL中的主键是聚集索引。我不知道旧版本,tho。不过,导入部分是,EF MS SQL驱动程序知道不要为PK创建单独的索引。我希望,另一个DB的EF驱动程序(PK没有索引备份)将创建一个。“EF本身不会创建列描述中提到的约束尚未暗示的索引。”同样,EF指的是一些EF数据库驱动程序,它对数据库is服务有一些了解,但不够聪明,无法查看索引是否已经存在,对吗?是的。EF数据库提供程序为您创建sql查询,也用于创建表。在这里,似乎MS SQL provider将“默认”在创建时在第一个位置的主键上创建索引。实际上,人们期望它在PK列(或至少其中一列)上创建一个索引——如果没有注意到复合PK(因此隐含的add.index)是出于设计或错误,我不知道。
CREATE TABLE [dbo].[Blogs] (
    [BlogId] [int] NOT NULL IDENTITY,
    [Name] [nvarchar](max),
    CONSTRAINT [PK_dbo.Blogs] PRIMARY KEY ([BlogId])
)
CREATE TABLE [dbo].[Posts] (
    [BlogId] [int] NOT NULL,
    [PostId] [int] NOT NULL,
    [Title] [nvarchar](max),
    [Content] [nvarchar](max),
    CONSTRAINT [PK_dbo.Posts] PRIMARY KEY ([BlogId], [PostId])
)

CREATE INDEX [IX_BlogId] ON [dbo].[Posts]([BlogId])

ALTER TABLE [dbo].[Posts] 
   ADD CONSTRAINT [FK_dbo.Posts_dbo.Blogs_BlogId] 
   FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blogs] ([BlogId]) 
       ON DELETE CASCADE