我有一个Azure移动服务项目(C#后端),我最近创建并附加到Azure SQL数据库。我一直在尝试在该后备数据库上启用代码优先迁移,但在尝试更新数据库时会抛出错误。
我执行了所有常规步骤以启用迁移(启用迁移,添加迁移)。但是当我尝试Update-Database时,它会返回以下错误:
无法在表'dbo.Appointments'上创建多个聚簇索引。删除现有的聚簇索引“PK_dbo.Appointments”,然后再创建另一个。
为什么会这样?我的数据库中没有任何表,该项目几乎是默认的。
答案 0 :(得分:11)
关于从自定义实体类派生的几个答案将有效,但它们不是理想的解决方案。正如EF团队(和其他人)所提到的,您只需将此行添加到Context Configuration构造函数中即可。
SetSqlGenerator("System.Data.SqlClient", new EntityTableSqlGenerator());
这将在创建迁移时删除您的错误,并允许您通过powershell命令更新数据库。
答案 1 :(得分:9)
如果在创建迁移类后在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/
答案 2 :(得分:5)
我今天正在与这个问题作斗争几个小时。直到我找到这个链接:
How to make data model changes to a .NET backend mobile service
如果按照那里的说明进行操作,肯定会有效。最重要的是,当您在本地调试会话期间按F5时,将进行迁移。
答案 3 :(得分:3)
我遇到了同样的问题。
它是由我们的基类EntityData的定义引起的:
public class OrgTest : EntityData
{
public string Prop1 { get; set; }
}
我用我自己的实现替换了EntityData" CustomEntity"我在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)]
[Timestamp]
public byte[] Version { get; set; }
}
现在我继承了这个:
public class OrgTest : CustomEntity // EntityData
{
public string Prop1 { get; set; }
}
可能我会有进一步的麻烦,但暂时我可以创建我的模型! 希望你也可以这样开始!
答案 4 :(得分:3)
参见这篇文章:
avoid nightmares using ef first migration in azure mobile services
EntityData定义聚簇索引创建一个Id默认情况下是一个聚类索引,这样它就会提供一个错误,你应该只定义一个。