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

时间:2014-04-07 21:41:26

标签: c# sql entity-framework ef-code-first azure-sql-database

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

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

  

无法在表'dbo.Appointments'上创建多个聚簇索引。删除现有的聚簇索引“PK_dbo.Appointments”,然后再创建另一个。

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

5 个答案:

答案 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默认情况下是一个聚类索引,这样它就会提供一个错误,你应该只定义一个。