我有一个Windows Azure移动服务应用程序,它具有Code First生成的数据库。连接字符串(在本地运行时)如下所示:
<add name="MS_TableConnectionString" connectionString="Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\<database_name.mdf;Initial Catalog=<database_name>;Integrated Security=True;MultipleActiveResultSets=True"
providerName="System.Data.SqlClient" />
我创建了一个新的Console App项目,引用了Mobile Services项目,并将此连接字符串复制到App.config文件
在Program.Main()中,我从Mobile Services项目的Designer中创建了一个Context类的新实例。但是,当我运行控制台应用程序,并尝试访问上下文公开的其中一个DbSets时,我得到以下异常:
"An exception occurred while initializing the database. See the InnerException for details."
内部例外:
"The underlying provider failed on Open."
反过来又有一个内在的例外:
"Cannot attach the file 'C:\\...\\<database_name>.mdf' as database '<database_name>'."
如果我在Console App中删除了连接字符串的AttachDbFilename部分,我会在代码中的同一点获得以下异常:
"Cannot create more than one clustered index on table 'dbo.<Table_Name>'. Drop the existing clustered index 'PK_dbo.<Table_Name>' before creating another"
有没有人知道为什么它会尝试创建这个新的聚集索引时,似乎已经有了?
或者任何想法我应该使用什么连接字符串来获得与数据库的正常读/写连接而不做任何奇怪的事情?这与数据库初始化有关吗?
编辑:今天早上,我有更多关于这方面的游戏。如果我从模型类中删除“Microsoft.WindowsAzure.Mobile.Service.EntityData”的继承,我可以无异常地工作,所以这看起来非常重要。
答案 0 :(得分:0)
好的,我刚刚与此作斗争并让它发挥作用。如果它有一天能帮助任何人,就打算输入它。
因此问题与我的Code First模型类继承自EntityData的事实有关。正如我在上面的编辑中所说,删除此继承确实可以解决问题。我认为这是因为EntityData类既具有[Key]属性的属性,又具有[Index(IsClustered = true)]属性的单独属性。由于表中不能有多个Clustered Index,因此数据库初始化失败。在默认的Azure移动服务项目中,必须有一些魔力,这意味着这不会发生在某个地方 - 但是从一个单独的项目中你得到了&#34;无法在表格上创建多个聚集索引&#34;异常。
所以我做的是通过添加以下行来禁用单独的控制台应用程序中的数据库初始化:
Database.SetInitializer<MobileServiceContext>(null);
...在实例化DbContext之前。
这允许我将移动服务应用程序初始化的数据库用作现有数据库,而不尝试对其进行任何更改。
我还需要在Console App的配置文件中使用以下AppSetting,以便它使用正确的架构名称:
<add key="MS_MobileServiceName" value="<CorrectSchemaName>" />