这是使用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
创建索引?
还有其他设置可以确定将在迁移中创建哪些索引吗?
答案 0 :(得分:0)
默认情况下,EF会在作为外键引用的每个属性上自动创建索引(非唯一)。
确保EF正确地在TblProduct
和TblProductItem
之间创建了关系(例如,在SQL Server中,通过扩展键)-否则,请使用Fluent Api明确指定关系。
关于其他设置,您可能需要使用Context类中的方法创建索引,但是如果设置了外键关系,则应自动生成该索引。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TblProductItem>()
.HasIndex(e => e.TrackID);
}
答案 1 :(得分:0)
我正在为同一件事苦苦挣扎。我发现,如果我颠倒了键的顺序(但是使用Fluent),它将代替第二列的索引。
所以对我来说,似乎在使用复合键时框架中存在一个错误。正是外键注释导致创建索引,但是在此过程中,似乎认为主键仅是FIRST列(在这种情况下,“主键”列不需要额外的索引),因此它仅创建第二个索引。但是主键是复合键,因此它可能也应该为第一列创建索引。
一种解决方法(如果您确实也希望对第一列也进行索引),则可以执行已接受答案中建议的操作。如果该错误(AFAIK)稍后得到修复,我认为通过尝试创建额外的索引或其他任何内容都不会引起问题。