在本地计算机中使用Azure移动服务进行开发[.Net后端]

时间:2014-09-03 14:50:24

标签: c# azure azure-mobile-services

我正在使用Azure移动服务开发云服务,为了快速测试并调试它,我想将其部署在我的本地计算机上。我选择了项目,点击F5,在我的本地PC上运行IIS Express。我针对IIS服务的本地URI地址执行客户端,当我尝试插入值时,如果我尝试检索或插入新对象,则会出现此异常:

An exception of type 'System.ArgumentException' occurred in EntityFramework.SqlServer.dll but was not handled in user code 

Additional information: The database name 'TR_MyTrip_Server_ExtraData_Service]_Persons_InsertUpdateDelete' is invalid. Database names must be of the form [<schema_name>.]<object_name>.

我调试了控制器的初始化,发现移动服务在ServiceContext对象的DataBase属性上部署了一个带有此连接信息的LocalDb实例:

Data Source=(localdb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-MyTrip.Server.ExtraData.Service-20140731060708.mdf;Initial Catalog=aspnet-TestProject.Server.ExtraData.Service-20140731060708;Integrated Security=True;MultipleActiveResultSets=True

如果我尝试通过SQL Management Studio将此连接字符串连接到LocalDB,则无法找到此DataBase

我能够在CMD上运行此命令的SQL管理工作室访问LocalDb实例并检索LocalDB的连接

SqlLocalDB.exe info v11.0

无论如何,在SQL Management Studio上,我无法看到任何与我的移动服务控制器相关的数据库。我在google上搜索过,我找到的唯一相关链接是this但是没有用...有人知道发生了什么吗?

非常感谢

3 个答案:

答案 0 :(得分:17)

如果项目名称中包含句点,则会出现此问题。像TestProject.Server.ExtraData.Service。

要解决此问题,请进入web.config并编辑名为“MS_MobileServiceName”的appsetting,取出句点。这是用作数据库中移动服务表的SQL模式名称的值。它不能包含句号或其他特殊字符。

我通常会尝试将其与我将部署的移动服务的名称相同,但这在技术上并不需要。

答案 1 :(得分:2)

无论出于何种原因,我都无法使用接受的答案来解决这个问题。我认为这与web.config中的免责声明有关:

  

发布到移动服务后,这些设置将被门户网站中指定的值覆盖。

但是,我确实找到了MobileServiceContext文件中的另一个解决方法,我替换了这一行:

string schema = ServiceSettingsDictionary.GetSchemaName();
if (!string.IsNullOrEmpty(schema))
{
    modelBuilder.HasDefaultSchema(schema);
}

使用简单的字符串值modelBuilder.HasDefaultSchema('mySchema');

我认为有一种方法可以影响GetSchemaName()的输出,但考虑到解决这个问题花了多少精力,我现在非常满意这个解决方案。

答案 2 :(得分:2)

如果您已更改配置中的MS_MobileServiceName以删除期间,并且您仍然收到错误,那么您需要在包管理器中重新运行脚手架以进行初始迁移控制台:

Add-Migration Initial -Force

从我所看到的,脚手架生成一个嵌入的.resx,它仍然具有旧的模式名称(DefaultSchema),以及设计器代码中引用的快照(Target)。只是更改DefaultSchema并没有为我解决问题,但是重新运行脚手架了。

我还在我的模型中添加了表注释,但我不认为这是问题所在。如果您的服务已经上线,那可能并不理想。