在移动服务数据库上启用代码优先迁移时出错

我有一个Azure移动服务项目(C#后端),我最近创建并附加到Azure SQL数据库。 我一直在尝试在该后备数据库上启用代码优先迁移,但在尝试更新数据库时会抛出错误。

我执行了所有常规步骤以启用迁移(启用迁移,添加迁移)。 但是当我尝试Update-Database时,它会返回以下错误:

无法在表’dbo.Appointments’上创建多个聚簇索引。 在创建另一个之前删除现有的聚簇索引“PK_dbo.Appointments”。

为什么会这样? 我的数据库中没有任何表,该项目几乎是默认的。

关于从自定义实体类派生的几个答案将起作用,但它们不是理想的解决方案。 正如EF团队(和其他人)所提到的,您只需将此行添加到Context Configuration构造函数中即可。

SetSqlGenerator("System.Data.SqlClient", new EntityTableSqlGenerator()); 

这将在创建迁移时删除您的错误,并允许您通过powershell命令更新数据库。

如果在创建迁移类后在update-database上收到此错误,请查看@迁移类。 迁移类将采用primary是聚簇索引。 所以从up()方法中删除它。

.PrimaryKey(t => t.Id,clustered:false).Index(t => t.CreatedAt,clustered:true);

如果您在azure色移动服务上使用它,请不要手动调用“update-database”。 参考http://azure.microsoft.com/en-in/documentation/articles/mobile-services-dotnet-backend-how-to-use-code-first-migrations/

我今天正在与这个问题作斗争几个小时。 直到我找到这个链接:

如何对.NET后端移动服务进行数据模型更改

如果你按照那里的说明,它肯定会工作。 最重要的是,当您在本地调试会话期间按F5时,将发生迁移。

我刚才有同样的问题。

它是由我们的基类EntityData的定义引起的:

 public class OrgTest : EntityData { public string Prop1 { get; set; } } 

我用我自己的实现“CustomEntity”替换了EntityData,在那里我删除了CreatedAt列上的属性[Index(IsClustered = true)]:

 public abstract class CustomEntity : ITableData { // protected CustomEntity(); [DatabaseGenerated(DatabaseGeneratedOption.Identity)] [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)] 1541616478 public byte[] Version { get; set; } } 

现在我从这个inheritance:

 public class OrgTest : CustomEntity // EntityData { public string Prop1 { get; set; } } 

可能我会有进一步的麻烦,但暂时我可以创建我的模型! 希望你也可以这样开始!

看到这篇文章:

避免在azure色移动服务中使用ef首次迁移做噩梦

EntityData为CreateAt定义集群indext,Id默认为集群索引,这样它提供了一个错误,你应该只定义一个。