我正在做一些额外的工作并开发非常简单的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
答案 0 :(得分:3)
啊......我发现了另一个让我解决问题的问题。
here is Original question和here is an article以及有关正确迁移过程的更多详细信息。
通常,您需要稍微更改WebApiConfig实现:
从Database.SetInitializer(..)
功能
Register()
来电
代替那条线:
var migrator = new DbMigrator(new Configuration());
migrator.Update();
现在运行应用程序后,一切似乎都运行良好。命令Update-Database
也按预期工作。