以下是域名:
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
上的约束?有可能吗?
答案 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");