【问题标题】:How can Entity Framework Code First Create Index in Descendent order?Entity Framework Code First 如何按降序创建索引?
【发布时间】:2014-08-13 18:06:49
【问题描述】:

在 Fluent 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() 获得想要的结果?

【问题讨论】:

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


    【解决方案1】:

    从 Rowan Miller(Entity Framework 项目经理之一)的博客中查看如何customize code first migrations

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

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

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

    【讨论】:

      【解决方案2】:

      我想按照您的要求进行操作,但也可以使用多个列和多个订单来完成。

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

      查看this answer了解确切的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-05
        • 2017-05-25
        • 1970-01-01
        • 2015-10-22
        • 2015-04-12
        相关资源
        最近更新 更多