FluentMigrator非群集主键Sql Server?

时间:2011-02-22 21:53:12

标签: c# .net sql-server

今天开始使用FluentMigrator,不幸的是,我很确定我知道我的问题的答案,但是在使用Sql-Server提供程序时,有没有什么方法可以让FluentMigrator创建非聚簇主键?

我希望有类似的东西。 (显然不存在)..

  Create.Table("User")
        .WithColumn("Id").AsInt32().Identity().PrimaryKey().WithOptions().NonClustered()

到目前为止,我发现的最佳选择是使用带有SQL块的Execute,这远远不够理想......还有更好的选择吗?

4 个答案:

答案 0 :(得分:2)

如果有人正在查看,现在可以使用Fluent.Runner.Extensions和SQL Server特定扩展来解决它。

https://github.com/schambers/fluentmigrator/wiki/Sql-Server-Specific-Extensions

答案 1 :(得分:2)

要创建非聚集索引,您应按照here的说明使用 FluentMigrator.SqlServer

代码如下:

Create.Table("User").WithColumn("Id").AsInt32().Identity();
// than create PK
Create.PrimaryKey("PK_User").OnTable("User").Column("Id").NonClustered();

答案 2 :(得分:0)

不幸的是,唯一的做法是使用:

Execute.Script(path);

基本上,FluentMigrator已经成为运行SQL脚本的工具,但是忽略了流畅的界面。基本上,它在这个项目中比我的项目中的任何东西都要多。可能会自己滚动,但迁移组件按预期工作。 Fluent界面太过限制,在定义表等时通常需要DB特定功能才能获得最佳性能(数据库不可知并不是一件好事)。

答案 3 :(得分:0)

这不是很漂亮,但它对我有用。添加扩展程序以包装脚本。

public static class FluentMigratorExtensions
{
    public static void CreateNonClusteredPrimaryKey(this Migration migration, string indexName, string columnName, string tableName, string schemaName = "dbo")
    {
        var sql =
            @"ALTER TABLE [{3}].[{2}] ADD CONSTRAINT {0} PRIMARY KEY NONCLUSTERED ({1});";
        sql = string.Format(sql, indexName, columnName, tableName, schemaName);
        migration.Execute.Sql(sql);
    }
}

在您的迁移中将其命名为

    this.CreateNonClusteredPrimaryKey("PK_Users", 
                                      "Id", 
                                      "Users", 
                                      "security");