实体框架6.1:如何将聚簇索引更改为另一列?

时间:2015-06-28 06:00:08

标签: c# entity-framework entity-framework-6

我有一个这样的实体:

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)

自动生成?

1 个答案:

答案 0 :(得分:2)

EntityFamework将所有主键创建为聚簇索引,上面的代码(映射)指定列具有主键和非聚簇索引,然后尝试在主键发生时将聚簇索引添加到另一列已经聚集在一起。

AFAIK并且无需更改迁移就无法创建非群集主键,您需要更改迁移

.PrimaryKey(t => t.Id, null, true)