Asp.net core migrationBuilder如何确定要创建哪些索引?
这是使用asp.net core 2.0、EF、visual studio 2017、sql server 2016,并使用package manager控制台中的“添加迁移”工具通过package manager控制台创建db迁移 我有一个简单的多对多关系,配置如下,2个表和第三个“连接表”:Asp.net core migrationBuilder如何确定要创建哪些索引?,asp.net-core,migration,many-to-many,entity-framework-core,Asp.net Core,Migration,Many To Many,Entity Framework Core,这是使用asp.net core 2.0、EF、visual studio 2017、sql server 2016,并使用package manager控制台中的“添加迁移”工具通过package manager控制台创建db迁移 我有一个简单的多对多关系,配置如下,2个表和第三个“连接表”: public class TblTrack { public int ID { get; set; } ... //Navigation properties pu
public class TblTrack
{
public int ID { get; set; }
...
//Navigation properties
public List<TblProductItem> ProductItems { get; set; }
}
public class TblProduct
{
public int ID { get; set; }
...
//Navigation properties
public List<TblProductItem> ProductItems { get; set; }
}
public class TblProductItem
{
[Key]
[Required]
public int ProductID { get; set; }
[Key]
[Required]
public int TrackID { get; set; }
//Navigation properties
public TblProduct Product { get; set; }
public TblTrack Track { get; set; }
}
请有人解释一下:
索引的目的是什么
为什么要为TrackID
创建索引,而不是为ProductID
创建索引
是否有其他设置来确定迁移中将创建哪些索引?默认情况下,EF会自动在每个外键引用属性上创建索引(非唯一) 确保EF正确创建了
TblProduct
和TblProductItem
之间的关系(例如,在SQL Server中通过展开键)-如果没有,请使用Fluent Api显式指定关系
关于其他设置,您可以要求在上下文类中使用方法创建索引,但若设置了外键关系,那个么该索引应该自动生成
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TblProductItem>()
.HasIndex(e => e.TrackID);
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.HasIndex(e=>e.TrackID);
}
我也在为同样的事情挣扎。我发现,如果我颠倒键的顺序(使用Fluent),它将为第二列创建索引
所以在我看来,当使用复合键时,框架中似乎有一个bug。正是ForeignKey注释导致了索引的生成,但在这个过程中,它似乎认为主键只是第一列(在这种情况下,“主键”列不需要额外的索引),因此它只为第二列创建索引。但是主键是复合键,因此它可能也应该为第一列创建索引
一种解决方法(如果您真的希望第一列也被索引)是按照公认答案中的建议进行操作。如果以后修复该错误(AFAIK),我认为尝试创建额外的索引或任何东西都不会导致问题。我认为这对于您使用的提供商来说太具体了。哪一个?索引通常由EF在3种情况下创建:1)在任何FK列上,应创建聚集的非唯一索引;2) 在任何PK列上,应创建唯一的主键约束以及相关索引;3) 通过Fluent API或数据注释添加的其他索引。具体的命令显然是由EF提供程序生成的,如果常规索引创建来自上下文模型或提供程序(作为子例程的一部分),我不确定。谢谢,我在上面添加了一些细节。我想我很惊讶看到自动为TrackID而不是ProductID创建索引-除了引用不同的表外,外键是相同的(在Fluent API中没有任何内容),那么为什么它会生成一个而不是另一个?这就是为什么我想知道为什么自动为TrackID而不是ProductID创建索引。表之间的FK关系已正确创建。我可以使用Fluent API添加索引,但为什么“添加迁移”不会自动添加索引?(或者更确切地说,它对一个FK有效,但对另一个FK无效)。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TblProductItem>()
.HasIndex(e => e.TrackID);
}