我有一个这样的实体:
public class Invoice
{
public Guid Id { get; set; }
public int InvoiceNumber { get; set; }
public string Caption { get; set; }
}
在我的映射文件中,我在InvoiceNumber
上设置了聚簇索引,并在Id
列上设置了非聚集索引。
public class InvoiceMapping : EntityTypeConfiguration<Invoice>
{
public InvoiceMapping()
{
HasKey(p => p.Id).Property(e => e.Id).HasColumnType(SqlDbType.UniqueIdentifier.ToString()).IsRequired()
.HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute() { IsClustered = false }));
Property(e => e.Caption).HasColumnType(SqlDbType.NVarChar.ToString());
Property(e => e.InvoiceNumber).HasColumnType(SqlDbType.Int.ToString()).HasColumnAnnotation("Index",
new IndexAnnotation(new IndexAttribute() { IsClustered = true ,IsUnique = true}));
}
}
迁移后,我生成的类看起来像:
CreateTable(
"dbo.Invoices",
c => new
{
Id = c.Guid(nullable: false),
InvoiceNumber = c.Int(nullable: false),
Caption = c.String(maxLength: 4000),
})
.PrimaryKey(t => t.Id)
.Index(t => t.Id)
.Index(t => t.InvoiceNumber, unique: true, clustered: true);
当我致电Update-Database
时,我收到此错误:
无法在表格&#39; dbo.Invoices&#39;上创建多个聚集索引。删除现有的聚集索引&#39; PK_dbo.Invoices&#39;在创造另一个之前。
----- ------更新
Neil 回答是正确的,但我认为我不需要编辑迁移代码和代码
.PrimaryKey(t => t.Id, null, true)
自动生成?
答案 0 :(得分:2)
EntityFamework将所有主键创建为聚簇索引,上面的代码(映射)指定列具有主键和非聚簇索引,然后尝试在主键发生时将聚簇索引添加到另一列已经聚集在一起。
AFAIK并且无需更改迁移就无法创建非群集主键,您需要更改迁移
.PrimaryKey(t => t.Id, null, true)