运行Update-Database时出错,告诉我无法在表上创建多个聚簇索引

时间:2014-11-09 11:39:39

标签: azure azure-sql-database database-migration azure-mobile-services

我正在做一些额外的工作并开发非常简单的Azure移动服务。我试图在项目中启用迁移,但面临奇怪的问题 - 我认为我做错了。

所有模型都继承自 Microsoft.WindowsAzure.Mobile.Service.EntityData 类,正如所有有关移动服务的教程所建议的那样。当我启用迁移时,添加初始迁移并尝试通过运行

来应用它
Update-Database

我在控制台收到错误:

Cannot create more than one clustered index on table 'XXX.YYY'. Drop the existing clustered index 'PK_XXX.YYY' before creating another.

当我们检查文档(here)时,我们可以找到确实存在的信息,azure sql数据库只能有一个聚簇索引。此外,当您添加主键时,它会自动为自己添加一个聚簇索引。没关系。但是,为什么EntityData看起来像这样:

public abstract class EntityData : ITableData
{
    protected EntityData();

    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [Index(IsClustered = true)]
    [TableColumn(TableColumnType.CreatedAt)]
    public DateTimeOffset? CreatedAt { get; set; }

    [TableColumn(TableColumnType.Deleted)]
    public bool Deleted { get; set; }

    [Key]
    [TableColumn(TableColumnType.Id)]
    public string Id { get; set; }

    [DatabaseGenerated(DatabaseGeneratedOption.Computed)]
    [TableColumn(TableColumnType.UpdatedAt)]
    public DateTimeOffset? UpdatedAt { get; set; }

    [TableColumn(TableColumnType.Version)]
    [Timestamp]
    public byte[] Version { get; set; }
}

正如我们所看到的,我们有Id属性的声明,它应该是主键+具有聚集索引的CreatedAt属性的声明。当我更改生成的迁移代码并从CreatedAt中删除例如聚集索引时,一切正常。但是,下次我将添加新的迁移时,它可能会再次找到差异并尝试添加该索引。我想避免这种情况。

我将非常感谢任何提示,技巧和帮助!

坦克你!

Darek

1 个答案:

答案 0 :(得分:3)

啊......我发现了另一个让我解决问题的问题。

here is Original questionhere is an article以及有关正确迁移过程的更多详细信息。

通常,您需要稍微更改WebApiConfig实现:

  • Database.SetInitializer(..)功能

  • 删除Register()来电
  • 代替那条线:

    var migrator = new DbMigrator(new Configuration()); migrator.Update();

现在运行应用程序后,一切似乎都运行良好。命令Update-Database也按预期工作。