C# 在另一个项目中使用Azure Mobile Services代码首先生成上下文类

C# 在另一个项目中使用Azure Mobile Services代码首先生成上下文类,c#,entity-framework,ef-code-first,C#,Entity Framework,Ef Code First,我有一个Windows Azure移动服务应用程序,它有一个代码优先生成的数据库。连接字符串(在本地运行时)如下所示: <add name="MS_TableConnectionString" connectionString="Data Source=(localdb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\<database_name.mdf;Initial Catalog=<database_name>;Inte

我有一个Windows Azure移动服务应用程序,它有一个代码优先生成的数据库。连接字符串(在本地运行时)如下所示:

<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" />
内部例外情况如下:

"The underlying provider failed on Open."
"Cannot attach the file 'C:\\...\\<database_name>.mdf' as database '<database_name>'."
这反过来又有一个内部例外:

"The underlying provider failed on Open."
"Cannot attach the file 'C:\\...\\<database_name>.mdf' as database '<database_name>'."
无法将文件“C:\\…\\\.mdf”作为数据库“”附加
如果在Console应用程序中删除连接字符串的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"
“无法在表'dbo'上创建多个聚集索引。请先删除现有聚集索引'PK_dbo'。然后再创建另一个”
有人知道为什么它会尝试创建这个新的聚集索引,而现在似乎已经有了

或者知道我应该使用什么样的连接字符串来获得到数据库的正常读/写连接,而不让它做任何奇怪的事情吗?这与数据库初始化有关吗


编辑:今天早上,我在这方面做了更多的尝试。如果我从模型类中删除“Microsoft.WindowsAzure.Mobile.Service.EntityData”的继承,我可以让它毫无例外地工作,因此这似乎非常重要。

好的,我刚刚完成了这项工作并使它工作起来。我会把它打出来以防有一天对任何人都有帮助

因此,问题在于我的代码优先模型类继承自EntityData。正如我在上面的编辑中所说,删除此继承似乎可以解决问题。我认为这是因为EntityData类既有一个带有[Key]属性的属性,也有一个单独的带有[Index(IsClustered=true)]属性的属性。因为一个表中不能有多个聚集索引,所以数据库初始化失败。在默认的Azure移动服务项目中,一定有某种魔力意味着这不会发生在某个地方——但是从一个单独的项目中,您会得到“不能在表上创建多个聚集索引”异常

因此,我所做的是通过添加以下行在单独的控制台应用程序中禁用数据库初始化:

Database.SetInitializer<MobileServiceContext>(null);
Database.SetInitializer(null);
…在实例化DbContext之前

这使我可以将移动服务应用程序初始化的数据库用作现有数据库,而无需尝试对其进行任何更改

我还需要在Console应用程序的配置文件中使用以下AppSetting,以便它使用正确的架构名称:

<add key="MS_MobileServiceName" value="<CorrectSchemaName>" />