在流畅的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()
?
答案 0 :(得分:4)
从Rowan Miller(实体框架项目经理之一)的博客中了解如何customize code first migrations。
这描述了如何覆盖SqlServerMigrationsSqlGenerator
sql生成器以允许自定义参数影响生成的sql。
实际上,他所经历的场景是扩展CreateIndex
迁移操作的默认行为,以支持指定降序索引的创建。
但是,我认为不可能将此扩展点公开给代码优先的域模型创建代码。
答案 1 :(得分:0)
我想做你要求的事情,但也要做多个列和多个订单。
基于Matt Caton's answer和Rowan Miller博客,我能够回答我自己的问题并获得尽可能通用的自定义解决方案(知道您无法轻松扩展实体框架类以添加不具备的属性)存在)。
有关确切的解决方案,请参阅this answer。