在另一个项目中使用 Azure 移动服务代码首次生成的上下文类

本文关键字:上下文 代码 服务 项目 另一个 移动 Azure | 更新日期: 2023-09-27 18:32:34

我有一个Windows Azure Mobile Services应用程序,它有一个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" />

我创建了一个新的控制台应用项目,引用了移动服务项目,并将此连接字符串复制到 App.config 文件

在 Program.Main(( 中,我从移动服务项目中的设计器创建了上下文类的新实例。但是,当我运行控制台应用程序并尝试访问上下文公开的 DbSet 之一时,我收到以下异常:

"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>'."

如果我在控制台应用中删除连接字符串的 AttachDb文件名部分,则在代码中的同一点出现以下异常:

"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"的继承,我可以让它无一例外地工作,所以这似乎非常重要。

在另一个项目中使用 Azure 移动服务代码首次生成的上下文类

好的,

我刚刚通过这个并让它工作。去输入这个,以防有一天它对任何人有帮助。

因此,问题与我的 Code First 模型类继承自 EntityData 这一事实有关。正如我在上面的编辑中所说,删除此继承似乎确实可以解决问题。我认为这是因为 EntityData 类既有一个带有 [Key] 属性的属性,又有一个带有 [Index(IsClustered = true(] 属性的单独属性。由于表中不能有多个聚集索引,因此数据库初始化将失败。在默认的 Azure 移动服务项目中,必须有一些魔力,这意味着这不会在某处发生 - 但从单独的项目中,你会得到"无法在表上创建多个聚集索引"异常。

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

Database.SetInitializer<MobileServiceContext>(null);

。在实例化 DbContext 之前。

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

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

<add key="MS_MobileServiceName" value="<CorrectSchemaName>" />
相关文章: