实体框架代码如何首先按降序创建索引?

时间:2014-08-13 18:06:50

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

在流畅的API中,我们可以在字段上指定索引:

var indexAttr = new IndexAttribute("IX_EmployeeNumber")
{
    IsClustered = true
};

Property(c => c.EmployeeNumber)
    .HasColumnAnnotation("Index", new IndexAnnotation(indexAttr ))
    .HasMaxLength(8)
    .IsRequired();

Add-Migration之后,我们会收到CreateIndex声明:

CreateIndex("dbo.Employees", "EmployeeNumber", clustered: true, name: "IX_EmployeeNumber");

Update-Database之后,我们有一个像这样的SQL:

CREATE CLUSTERED INDEX [IX_EmployeeNumber] ON [dbo].[Employees]
(
    [EmployeeNumber] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

我的问题是:如何以后代顺序创建此索引?类似的东西:

CREATE CLUSTERED INDEX [IX_EmployeeNumber] ON [dbo].[Employees]
(
    [EmployeeNumber] DESC

我在CreateIndex找不到相关参数。是否可以在Code First迁移中实现?

当然,我们知道我们可以使用DbMigration.Sql(...some sql statement...)。但是,我们如何使用CreateIndex()

获得所需的结果

2 个答案:

答案 0 :(得分:4)

从Rowan Miller(实体框架项目经理之一)的博客中了解如何customize code first migrations

这描述了如何覆盖SqlServerMigrationsSqlGenerator sql生成器以允许自定义参数影响生成的sql。

实际上,他所经历的场景是扩展CreateIndex迁移操作的默认行为,以支持指定降序索引的创建。

但是,我认为不可能将此扩展点公开给代码优先的域模型创建代码。

答案 1 :(得分:0)

我想做你要求的事情,但也要做多个列和多个订单。

基于Matt Caton's answer和Rowan Miller博客,我能够回答我自己的问题并获得尽可能通用的自定义解决方案(知道您无法轻松扩展实体框架类以添加不具备的属性)存在)。

有关确切的解决方案,请参阅this answer