【问题标题】:Error While Enabling Code-First Migrations On Mobile Services Database在移动服务数据库上启用代码优先迁移时出错
【发布时间】:2014-05-20 08:38:55
【问题描述】:

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

我执行了所有常规步骤以启用迁移(启用-迁移、添加-迁移)。但是当我尝试更新数据库时,它返回以下错误:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    How to make data model changes to a .NET backend mobile service

    如果您按照那里的说明进行操作,它肯定会起作用。主要的是,当您在本地调试会话期间按 F5 时,将发生迁移。

    【讨论】:

    • 这是正确答案。当我尝试下面的答案时,客户端总是会在我查询它时抛出“错误请求”错误,即使我可以使用 Fiddler 来拉取数据。所以我炸毁了我的数据库,继承自 EntityData,然后使用自动迁移来处理创建表。它有效!!!
    • 链接似乎已移动 here
    【解决方案2】:

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

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

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

    【讨论】:

    • 这个解决方案对我有用。我已经多次将应用程序部署到服务器并删除了所有表以重新开始 - 在此错误突然发生之前。因此,添加这一行并再次重新部署就可以了 - 之后我的所有表都被重新创建了。谢谢。
    • 这在您的“Configuration.cs”文件中。内部密封类配置:DbMigrationsConfiguration { public Configuration() { AutomaticMigrationsEnabled = true; SetSqlGenerator("System.Data.SqlClient", new EntityTableSqlGenerator()); }
    【解决方案3】:

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

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

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

    【讨论】:

    • 这不再链接到任何有用的东西。尝试在 azure 页面上搜索,但没有任何乐趣...
    【解决方案4】:

    见这篇文章:

    avoid nightmares using ef first migration in azure mobile services

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

    【讨论】:

    【解决方案5】:

    我也遇到了同样的问题。

    这是由我们的基类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)]
        [Timestamp]
        public byte[] Version { get; set; }
    } 
    

    现在我继承了这个:

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

    以后我可能会遇到麻烦,但目前我可以创建我的模型! 希望你也可以这样开始!

    【讨论】:

    • 我最终只使用了一个 Web API 项目。这很可能是正确的答案,但我无法确认解决方案。
    • 它按照我之前发布的教程工作。然而,重要的是,在发布之前在本地运行项目 (F5),并按照教程第 6 点所述在 WebApiConig 类中进行更改,并启用自动迁移(配置类在您的迁移文件夹)。由于我使用的是这个工作流程,我没有任何进一步的问题,除了有一次没有正确设置数据库访问权限。但这似乎现在也解决了。
    • 我遇到了这个问题,当我尝试使用此 CustomEntity 将一行插入到表中时,我收到以下错误:The operation failed with the following error: 'Cannot insert the value NULL into column 'CreatedAt'
    • 你有什么解决办法吗?现在我遇到了这种错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    相关资源
    最近更新 更多