.NET Core 3.1中如何将SQL Server带包含列的非聚集索引创建语句转换为FluentMigrator表达式
解决FluentMigrator中添加INCLUDE列的问题
嗨,刚好我之前也处理过类似的场景,帮你把这段SQL转换成正确的FluentMigrator代码,顺便纠正你现有代码里的一个小误区!
首先,你现有代码里的.OnColumn("MyColumn1").Unique()和.OnColumn("MyColumn2").Unique()是不对的——因为你的原始SQL里并没有创建唯一非聚集索引,.Unique()会给索引加上唯一约束,这和你要实现的效果不符,得把这两个.Unique()去掉。
接下来是你最关心的INCLUDE子句的实现:FluentMigrator专门提供了.IncludeColumns()方法,用来指定索引的包含列,你可以直接传入多个列名作为参数。另外,SQL里的ONLINE = ON选项,在FluentMigrator中可以通过.WithOptions().NonClustered().Online()来配置。
完整的代码如下:
Create.Index("nci_wi_XXXXXX") .OnTable("MyTable") .OnColumn("MyColumn1").Ascending() // 不写的话默认也是升序,可省略 .OnColumn("MyColumn2").Ascending() .IncludeColumns("MyColumn3", "MyColumn4", "MyColumn5", "MyColumn6", "MyColumn7", "MyColumn8", "MyColumn9") .WithOptions() .NonClustered() .Online(); // 对应SQL中的ONLINE = ON
关键部分说明:
.IncludeColumns(...):完全对应SQL语句中的INCLUDE子句,把需要包含的非索引列一次性传入即可.Online():仅适用于SQL Server(你的场景刚好匹配),开启在线索引创建,避免锁表- 去掉
.Unique():因为你的原始SQL没有指定唯一约束,保留的话会生成CREATE UNIQUE NONCLUSTERED INDEX,不符合需求
如果你的索引列需要指定降序排序,只需要把.Ascending()换成.Descending()就行,比如.OnColumn("MyColumn1").Descending()。
内容的提问来源于stack exchange,提问作者Artur Quirino
相关产品推荐
相关产品推荐

