migrationBuilder如何确定要创建的索引?

时间:2018-06-24 10:24:42

标签: asp.net-core migration many-to-many entity-framework-core

这是使用asp.net core 2.0,EF,Visual Studio 2017,SQL Server 2016,并使用包管理器控制台中的“ add-migration”工具通过包管理器控制台创建数据库迁移。

我有一个简单的多对多关系,配置如下,有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; }
}

这是从迁移(在PMC中生成)创建联接表的

migrationBuilder.AddPrimaryKey(
name: "PK_tbl_ProductItems",
table: "tbl_ProductItems",
columns: new[] { "ProductID", "TrackID" });

migrationBuilder.CreateIndex(
name: "IX_tbl_ProductItems_TrackID",
table: "tbl_ProductItems",
column: "TrackID");

请有人解释:

索引IX_tbl_ProductItems_TrackID的用途是什么?

为什么为TrackID创建索引而不为ProductID创建索引?

还有其他设置可以确定将在迁移中创建哪些索引吗?

2 个答案:

答案 0 :(得分:0)

默认情况下,EF会在作为外键引用的每个属性上自动创建索引(非唯一)。

确保EF正确地在TblProductTblProductItem之间创建了关系(例如,在SQL Server中,通过扩展键)-否则,请使用Fluent Api明确指定关系。

关于其他设置,您可能需要使用Context类中的方法创建索引,但是如果设置了外键关系,则应自动生成该索引。

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<TblProductItem>()
        .HasIndex(e => e.TrackID);
}

答案 1 :(得分:0)

我正在为同一件事苦苦挣扎。我发现,如果我颠倒了键的顺序(但是使用Fluent),它将代替第二列的索引。

所以对我来说,似乎在使用复合键时框架中存在一个错误。正是外键注释导致创建索引,但是在此过程中,似乎认为主键仅是FIRST列(在这种情况下,“主键”列不需要额外的索引),因此它仅创建第二个索引。但是主键是复合键,因此它可能也应该为第一列创建索引。

一种解决方法(如果您确实也希望对第一列也进行索引),则可以执行已接受答案中建议的操作。如果该错误(AFAIK)稍后得到修复,我认为通过尝试创建额外的索引或其他任何内容都不会引起问题。