如何将索引从主键更改为另一个唯一列?

时间:2014-07-28 19:01:47

标签: entity-framework ef-code-first ef-migrations

以下是域名:

public class Citation
{
    public Guid Id { get; set; }
    public string CitationNumber { get; set; }
    public DateTime CitationDate { get; set; }
    public decimal Amount { get; set; }
}

和Fluent API:

ToTable("Citations");
HasKey(c => c.Id);

Property(c => c.Id)
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);

Property(c => c.CitationNumber)
    .HasMaxLength(8)
    .IsRequired();

Property(c => c.CitationDate)
    .IsRequired();

Property(c => c.CitationAmount)
    .HasColumnType("Money")
    .IsRequired();

默认情况下,会在Guid字段Id上添加索引。为了提高性能,我想将索引移到CitationNumber,这也是一个唯一的值字段。

所以SQL脚本应该是:

ALTER TABLE dbo.Citations
DROP CONSTRAINT [PK_dbo.Citations]
GO

ALTER TABLE dbo.Citations ADD CONSTRAINT
    [PK_dbo.Citations] PRIMARY KEY NONCLUSTERED (Id)

ALTER TABLE dbo.Citations ADD CONSTRAINT
IX_Citations_CitationNumber UNIQUE CLUSTERED (CitationNumber DESC)

我可以在CitationNumber上添加索引:

var indexAttr = new IndexAttribute("IX_Citations_CitationNumber")
    {
    IsClustered = true,
    IsUnique = true,
    Order = 1
    };

Property(c => c.CitationNumber)
    .HasColumnAnnotation("Index", new IndexAnnotation(indexAttr))

但是如何删除Id上的约束?有可能吗?

2 个答案:

答案 0 :(得分:0)

不,即使在sql中也不能这样做。查看documentation

  

创建主键会自动创建相应的唯一键,   聚簇或非聚簇索引。

您可以做的是将索引添加到另一列,但您无法阻止EF在主键列上创建索引。

以下是如何使用流畅的api或属性添加另一个索引。

modelBuilder.Entity<TheEntity>()
    .Property(e => e.TheProperty)
    .HasColumnAnnotation("IndexName", new IndexAnnotation(new IndexAttribute { IsUnique = true })));

[Index("IndexName", IsUnique = true)]
public int TheProperty { get; set; }

PS:但是你可以稍后使用sql查询删除索引。

答案 1 :(得分:0)

对于EF 7来说,它变得简单了。您可以将以下选项与haskey选项一起使用。

ForSqlServerIsClustered(false); 

我们可以像

一样使用它
supplierItemEntity.HasKey(supplierItem => supplierItem.SupplierItemId).ForSqlServerIsClustered(false);

 supplierItemEntity.HasIndex(s => new { s.ItemId }).ForSqlServerIsClustered(true).HasName("IX_SupplierItem_ItemId");

enter image description here