2 回答
TA贡献1806条经验 获得超5个赞
看起来像 EF6 错误(我猜是为了优化冗余索引)。数据库提供程序无关紧要(SqlServer 提供程序也是如此)。
一种错误的行为是你所描述的。另一种情况是,如果您交换两次HasIndex
调用的顺序,生成的迁移包含正确的ix_index1
,但ix_index2
根本没有。
由于这是一个错误,除了将问题报告给 EF6 问题跟踪器并等待最终修复之外,别无他法。
但是,如果(Column1, Column2, Column2)
是迁移所指示的 PK ,则该 PKix_index2
是多余的,您可以安全地将其从 fluent 配置中删除,这将允许正确生成ix_index1
.
TA贡献1886条经验 获得超2个赞
好的,因为我最初尝试的方法被确认由于错误而被破坏 - 我能够找到另一个解决方案,它似乎工作正常,但更脏。
例如,假设您要创建 4 个索引,如下所示:
modelBuilder.Entity<MyEntity2>()
.HasIndex(p => new { p.Column1, p.Column2, p.Column3, p.Column5 })
.HasName("ix_1")
.IsUnique();
modelBuilder.Entity<MyEntity2>()
.HasIndex(p => new { p.Column1, p.Column2, p.Column4, p.Column5 })
.HasName("ix_2")
.IsUnique();
modelBuilder.Entity<MyEntity2>()
.HasIndex(p => new { p.Column1, p.Column2, p.Column3 })
.HasName("ix_3")
.IsUnique();
modelBuilder.Entity<MyEntity2>()
.HasIndex(p => new { p.Column1, p.Column2, p.Column4 })
.HasName("ix_4")
.IsUnique();
结果(截至撰写本文时 31.07.2018)将被破坏。
要正确创建所有索引,您必须改用以下方法:
modelBuilder.Entity<MyEntity2>()
.Property(e => e.Column1)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
{
new IndexAttribute("ix_3", 1) { IsUnique = true },
new IndexAttribute("ix_4", 1) { IsUnique = true },
new IndexAttribute("ix_2", 1) { IsUnique = true },
new IndexAttribute("ix_1", 1) { IsUnique = true }
}));
modelBuilder.Entity<MyEntity2>()
.Property(e => e.Column2)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
{
new IndexAttribute("ix_3", 2) { IsUnique = true },
new IndexAttribute("ix_4", 2) { IsUnique = true },
new IndexAttribute("ix_2", 2) { IsUnique = true },
new IndexAttribute("ix_1", 2) { IsUnique = true }
}));
modelBuilder.Entity<MyEntity2>()
.Property(e => e.Column3)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
{
new IndexAttribute("ix_3", 3) { IsUnique = true },
new IndexAttribute("ix_1", 3) { IsUnique = true }
}));
modelBuilder.Entity<MyEntity2>()
.Property(e => e.Column4)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
{
new IndexAttribute("ix_4", 3) { IsUnique = true },
new IndexAttribute("ix_2", 3) { IsUnique = true },
}));
modelBuilder.Entity<MyEntity2>()
.Property(e => e.Column5)
.HasColumnAnnotation(
IndexAnnotation.AnnotationName,
new IndexAnnotation(new[]
{
new IndexAttribute("ix_2", 4) { IsUnique = true },
new IndexAttribute("ix_1", 4) { IsUnique = true },
}));
我希望我没有搞砸任何数字。但是这个想法应该是可以理解的。
- 2 回答
- 0 关注
- 183 浏览
添加回答
举报