如何在Azure移动服务项目中初始化代码优先的Entity Framework数据库

dum*_*dad 4 ef-code-first ef-migrations azure-mobile-services

我对Azure移动服务中使用Entity Frameworks代码优先迁移感到困惑.

我正在阅读文章如何通过Stack Overflow答案的额外帮助使数据模型更改为.NET后端移动服务,并且还阅读了团队环境中的代码优先迁移代码优先迁移,并观看了迁移 - 引擎盖下.

在Visual Studio 2015中,我创建了一个新的Azure移动服务,然后通过转到nuget包管理器控制台(PMC)并运行来启用代码优先迁移Enable-Migrations.然后我构建并运行该项目.然后,为了创建数据库,我使用PMC命令创建初始迁移,Add-Migration Initial并将其应用于PMC命令Update-Database -Verbose -TargetMigration Initial.

这失败并显示错误消息

无法在表'MobileService1.TodoItems'上创建多个聚簇索引.删除现有的聚簇索引"PK_MobileService1.TodoItems",然后再创建另一个.

当我使用该Verbose标志时,我可以看到自动生成的SQL,并且确实将其插入到查询中并针对新建的数据库运行它会产生相同的错误,因为主键已经提供了聚簇索引.

CREATE TABLE [MobileService1].[TodoItems] (
    [Id] [nvarchar](128) NOT NULL,
    [Text] [nvarchar](max),
    [Complete] [bit] NOT NULL,
    [Version] rowversion NOT NULL,
    [CreatedAt] [datetimeoffset](7) NOT NULL,
    [UpdatedAt] [datetimeoffset](7),
    [Deleted] [bit] NOT NULL,
    CONSTRAINT [PK_MobileService1.TodoItems] PRIMARY KEY ([Id])
)
CREATE CLUSTERED INDEX [IX_CreatedAt] ON [MobileService1].[TodoItems]([CreatedAt])
Run Code Online (Sandbox Code Playgroud)

文章确实提醒我做出改变:替换Database.SetInitializer(new MobileServiceInitializer());MobileService1.WebApiConfig.Register

var migrator = new System.Data.Entity.Migrations.DbMigrator(new Migrations.Configuration());
migrator.Update();
Run Code Online (Sandbox Code Playgroud)

但是在进行了更改之后,当我Update-Database -Verbose -TargetMigration Initial在PMC 运行时,我得到了完全相同的错误.

另一项建议,从他的问题多米尼克亚历山大的评论本地运行Azure的移动服务器的项目是更换而不是Database.SetInitializer(new MobileServiceInitializer());MobileService1.WebApiConfig.Register

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MobileServiceContext, Migrations.Configuration>());
Run Code Online (Sandbox Code Playgroud)

但我又得到了完全相同的错误.

我该怎么用?是否有一种简单的方法通过Azure移动服务中使用的实体框架代码优先迁移?

bre*_*sam 11

您看到的具体错误是由于EF假定主键也是聚簇索引,并且没有办法表明情况并非如此.当您执行自动迁移时,事情会起作用,因为当应用程序启动时,Mobile Services/Apps会注册一个自定义的SqlGenerator,它会删除聚集索引(以及其他一些重要的事情).默认情况下,迁移不使用此自定义SqlGenerator.

但是,您可以通过在Migrations\Configuration.cs文件中指定它来告诉您的迁移使用相同的SqlGenerator :

// Mobile Services namespace:
// using Microsoft.WindowsAzure.Mobile.Service.Tables

// Mobile Apps namespace:
// using Microsoft.Azure.Mobile.Server.Tables;

---<snip>---

    public Configuration()
    {
        AutomaticMigrationsEnabled = false;
        SetSqlGenerator("System.Data.SqlClient", new EntityTableSqlGenerator());
    }
Run Code Online (Sandbox Code Playgroud)

试一试.生成的数据库应包括CreatedAt触发器和移动服务/应用程序所期望的其他特定于SQL的设置.如果您遇到问题,请告诉我,我可以进一步了解.