Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net core migrationBuilder如何确定要创建哪些索引?_Asp.net Core_Migration_Many To Many_Entity Framework Core - Fatal编程技术网

Asp.net core migrationBuilder如何确定要创建哪些索引?

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

这是使用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
    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);
}