这是使用SQLCore2.0,EF,visual studio 2017,asp.net server 2016,并使用包管理器控制台中的添加-迁移工具通过包管理器控制台创建数据库迁移。
我有一个简单的多对多关系,配置如下,两个表和第三个'joining表‘:
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
创建了索引
是否有其他设置可以确定在迁移过程中将创建哪些索引?
发布于 2018-06-24 21:01:09
默认情况下,EF会在每个外键引用的属性上自动创建索引(非唯一)。
确保EF正确地创建了TblProduct
和TblProductItem
之间的关系(例如,在SQL Server中通过扩展键)-如果没有,请使用Fluent Api显式指定关系。
对于其他设置,您可以要求使用上下文类中的方法创建索引,但如果设置了外键关系,则应自动生成索引。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<TblProductItem>()
.HasIndex(e => e.TrackID);
}
发布于 2020-11-12 07:59:29
我也在为同样的事情苦苦挣扎。我发现,如果我颠倒了键的顺序(然而,使用Fluent ),它将为第二列创建索引。
因此,在我看来,在使用组合键时,框架中似乎存在一个bug。是ForeignKey注释导致了索引的建立,但是在这个过程中,它似乎认为主键只是第一列(在这种情况下,“主键”列不需要额外的索引),所以它只为第二列创建索引。但是主键是复合的,所以它可能也应该为第一列创建一个索引。
一种变通方法(如果您真的希望第一列也被索引)是按照公认答案中的建议进行操作。如果这个bug (AFAIK)稍后被修复,我不认为尝试创建一个额外的索引或任何东西会导致问题。
https://stackoverflow.com/questions/51008996
复制相似问题