我似乎无法理解Azure移动服务的概念,该移动服务使用带有Code First的.NET后端并启用了迁移。
目前我已经部署了一个"高效的" AMS的一个例子,让我们说它被称为" AMD"。它运行在amd.azure-mobile.net。已使用“启用 - 迁移”和“添加迁移”创建了数据库结构。现在这对于这个高效的实例来说都很好,它正在运行并且功能齐全。
现在我想创建一个INT实例,为测试等提供一个单独的环境。我想用不同的名称命名,比如" AMDINT"。它应该在amdint.azure-mobile.net上运行,并且还应该有一个单独的数据库,这样就不可能破坏生产中的东西。
最初我以为我可以像这样把它拉下来: 1)使用新数据库在amdint.azure-mobile.net下创建新实例 2)为新创建的配置创建一个web.config转换,名为" INT" (主要是将MS_MobileServiceName值更改为新名称) 3)下载新实例的发布配置文件,导入它,使其使用" INT"配置并部署它
显然已经部署了新位,但每当我遇到需要数据库访问的端点时,日志中都会生成错误并显示
数据库初始化失败。无法在架构' amdint'中初始化一个或多个对象。请确保数据库连接字符串正确。有关错误的更多详细信息,请参阅内部异常。 ---> System.InvalidOperationException:数据库初始化失败。无法在架构' amdint'中初始化一个或多个对象。请确保数据库连接字符串正确。有关错误的更多详细信息,请参阅内部异常。 ---> System.Data.SqlClient.SqlException:用户无权执行此操作。
因此,我使用Azure用户管理控制台(AUMC)查看新服务的配置选项卡中的连接字符串中指定的用户是否缺少权限,但该用户是否存在该数据库。我还编辑了用户的权限,以包含所有可能的权限,但这并没有改变任何内容。 然后我注意到迁移文件为Up()和Down()方法指定了数据库模式。对于测试,我从" amd.tablename"更改了这些字符串。到" amdint.tablename"我非常自信地钉了它。
然而,这仍然带来了同样的错误。所以我使用了连接字符串中的数据库用户凭证,并从浏览器中的管理控制台打开了数据库编辑器,看到它具有所有添加的权限,它可以很好地编辑数据库模式(创建和删除表格为测试目的)。但是,初始化程序没有创建单个表;数据库是空白的。
但是由于我能够编辑,我不知何故相信关于权限不足的错误消息会产生误导或我正在查看错误的地方。
有谁知道如何完成我想做的事情?显然,我不想为生产和INT提供单独的Visual Studio项目。
答案 0 :(得分:0)
我认为您遇到的问题是Mobile Services创建了一个特殊架构用户,该用户只能拥有该架构中的表。此架构与您的移动服务具有相同的名称。因此,即使两个数据库位于同一个数据库服务器上,DEV移动服务的连接字符串也不适用于PROD,反之亦然。
以下是一些使您的设置更轻松的建议:
在Azure门户中,移动服务不允许修改它为您创建的连接字符串,称为MS_TableConnectionString。我建议您在使用其他密钥时创建一个新的连接字符串,并将其用于每个服务,例如AMD_TableConnectionString
。确保对于每个服务,数据库用户都可以访问每个模式(一分钟内更多信息)。
要使用新的连接字符串,请在DbContext类中更改超级构造函数调用,例如base("name=AMD_TableConnectionString")
。
使用web.config和/或Azure门户中的应用程序设置MS_MobileServiceName
来设置服务的架构。这是由Mobile Service Entity Framework初始化程序使用的。
注意:如果您已经为DEV和PROD使用了单独的数据库,则可以选择为DEV和PROD实例使用相同的模式名称,这可能会使测试和设置更容易。
无论哪种方式,连接字符串中的数据库用户必须拥有您在MS_MobileServiceName
中指定的任何模式名称的完全权限。
(您可能正在使用此部分。)确保运行移动服务SQL生成器。如果您设置了Entity Framework数据库初始化程序,它将自动运行,但有些人喜欢通过数据库迁移完成所有数据库更改。在这种情况下,请按照本教程:https://azure.microsoft.com/en-us/documentation/articles/mobile-services-dotnet-backend-how-to-use-code-first-migrations/#using-code-first-migrations-without-an-initializer