在另一个项目中使用 Azure 移动服务代码首先生成的上下文 class
Using Azure Mobile Services Code First Generated Context class in another project
我有一个 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" />
我创建了一个新的控制台应用程序项目,引用移动服务项目,并将此连接字符串复制到 App.config 文件
在 Program.Main() 中,我从移动服务项目中的设计器创建了一个新的上下文实例 class。但是当我 运行 控制台应用程序,并尝试访问由 Context 创建的 public 的 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>'."
如果我在控制台应用程序中删除连接字符串的 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"
有谁知道为什么它会尝试创建这个新的聚簇索引,而现在已经有一个聚簇索引了?
或者我应该使用什么连接字符串来获得与数据库的正常 read/write 连接而不做任何奇怪的事情?这与数据库初始化有关吗?
编辑:今天早上我对此进行了更多尝试。如果我从我的模型 classes 中删除 "Microsoft.WindowsAzure.Mobile.Service.EntityData" 的继承,我可以让它毫无例外地工作,所以这看起来非常重要。
好的,我刚刚解决了这个问题并让它开始工作。我会把它写下来,以防有一天它对任何人有帮助。
所以问题与我的 Code First 模型 classes 继承自 EntityData 这一事实有关。正如我在上面的编辑中所说,删除此继承似乎确实可以解决问题。我认为这是因为 EntityData class 具有带有 [Key] 属性的 属性 和带有 [Index(IsClustered = true)] 属性的单独 属性。因为在 table 中不能有多个 Clustered Index,所以数据库初始化失败。在默认的 Azure 移动服务项目中,一定有一些魔法意味着这不会在某处发生——但是从一个单独的项目中你会得到 "Cannot create more than one clustered index on table" 异常。
所以我所做的是通过添加以下行在单独的控制台应用程序中禁用数据库初始化:
Database.SetInitializer<MobileServiceContext>(null);
...在实例化 DbContext 之前。
这使我可以将移动服务应用程序初始化的数据库用作现有数据库,而无需尝试对其进行任何更改。
我还需要在控制台应用程序的配置文件中添加以下 AppSetting,以便它使用正确的架构名称:
<add key="MS_MobileServiceName" value="<CorrectSchemaName>" />
我有一个 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" />
我创建了一个新的控制台应用程序项目,引用移动服务项目,并将此连接字符串复制到 App.config 文件
在 Program.Main() 中,我从移动服务项目中的设计器创建了一个新的上下文实例 class。但是当我 运行 控制台应用程序,并尝试访问由 Context 创建的 public 的 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>'."
如果我在控制台应用程序中删除连接字符串的 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"
有谁知道为什么它会尝试创建这个新的聚簇索引,而现在已经有一个聚簇索引了?
或者我应该使用什么连接字符串来获得与数据库的正常 read/write 连接而不做任何奇怪的事情?这与数据库初始化有关吗?
编辑:今天早上我对此进行了更多尝试。如果我从我的模型 classes 中删除 "Microsoft.WindowsAzure.Mobile.Service.EntityData" 的继承,我可以让它毫无例外地工作,所以这看起来非常重要。
好的,我刚刚解决了这个问题并让它开始工作。我会把它写下来,以防有一天它对任何人有帮助。
所以问题与我的 Code First 模型 classes 继承自 EntityData 这一事实有关。正如我在上面的编辑中所说,删除此继承似乎确实可以解决问题。我认为这是因为 EntityData class 具有带有 [Key] 属性的 属性 和带有 [Index(IsClustered = true)] 属性的单独 属性。因为在 table 中不能有多个 Clustered Index,所以数据库初始化失败。在默认的 Azure 移动服务项目中,一定有一些魔法意味着这不会在某处发生——但是从一个单独的项目中你会得到 "Cannot create more than one clustered index on table" 异常。
所以我所做的是通过添加以下行在单独的控制台应用程序中禁用数据库初始化:
Database.SetInitializer<MobileServiceContext>(null);
...在实例化 DbContext 之前。
这使我可以将移动服务应用程序初始化的数据库用作现有数据库,而无需尝试对其进行任何更改。
我还需要在控制台应用程序的配置文件中添加以下 AppSetting,以便它使用正确的架构名称:
<add key="MS_MobileServiceName" value="<CorrectSchemaName>" />