4

我有一个在本地完美运行的网络项目。但是,当我更改 Azure 上已发布网站中的连接字符串以连接到我在 SQL Azure 上的数据库时,它会开始出现此错误。

System.Data.Entity.Infrastructure.UnintentionalCodeFirstException: Code generated using the T4 templates for Database First and Model First development may not work correctly if used in Code First mode. To continue using Database First or Model First ensure that the Entity Framework connection string is specified in the config file of executing application. To use these classes, that were generated from Database First or Model First, with Code First add any additional configuration using attributes or the DbModelBuilder API and then remove the code that throws this exception.
   at MyClass.OnModelCreating(DbModelBuilder modelBuilder) in c:\a\src\MyProject\Model.Context.cs:line 25
   at System.Data.Entity.Internal.LazyInternalContext.CreateModelBuilder()
   at System.Data.Entity.Internal.LazyInternalContext.CreateModel(LazyInternalContext internalContext)
   at System.Data.Entity.Internal.RetryLazy`2.GetValue(TInput input)
   at System.Data.Entity.Internal.LazyInternalContext.InitializeContext()
   at System.Data.Entity.Internal.InternalContext.GetEntitySetAndBaseTypeForType(Type entityType)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Initialize()
   at System.Data.Entity.Internal.Linq.InternalSet`1.get_InternalContext()
   at System.Data.Entity.Infrastructure.DbQuery`1.System.Linq.IQueryable.get_Provider()
   at System.Linq.Queryable.Select[TSource,TResult](IQueryable`1 source, Expression`1 selector)

我的配置有:

<connectionStrings>
    <add name="MyDBEntities" connectionString="metadata=res://*/MyModel.csdl|res://*/MyModel.ssdl|res://*/MyModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;Server=tcp:[Removed].database.windows.net,1433;Database=MyDB;User ID=[Removed];Password=[Removed];Trusted_Connection=False;Encrypt=True;Connection Timeout=30;&quot;" providerName="System.Data.EntityClient" /> 
    <add name="MyDB" connectionString="metadata=res://*/Model.csdl|res://*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Server=tcp:[Removed].database.windows.net,1433;Database=MyDB;User ID=[Removed];Password=[Removed];Trusted_Connection=False;Encrypt=True;Connection Timeout=30;&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

我使用该连接字符串在本地使用我的单元测试进行了测试,它可以在连接到 SQL Azure 数据库的本地计算机上运行。任何帮助表示赞赏。

4

1 回答 1

16

我今天遇到了这个确切的问题;这是我第一次部署到 Azure。我一直在拔头发,但我没有剩下的了。 我终于弄明白了,这可能与这里的原始发帖人有同样的问题。

就像原始海报一样,我在这些配置中进行了测试:

  • 从 Visual Studio 对本地数据库运行 WCF Web 应用程序——成功
  • 将 WCF Web App 从 Visual Studio 部署到本地 IIS,针对本地 DB 运行——成功
  • 从 Visual Studio 对 Azure SQL DB 运行 WCF Web 应用程序——成功
  • 通过 Visual Studio 将 WCF 应用程序部署到 Azure,针对 Azure SQL DB 运行——失败!!

在阅读了另一篇文章(代码优先与数据库优先)之后,我得到了一个提示。那篇文章说,如果“连接字符串有元数据,EF 认为它是模型优先或数据库优先”,但如果它是“普通连接字符串,EF 认为它是代码优先”。我浏览了已部署的 Azure 网站的 web.config,并确认连接字符串具有对 Model-First 元数据的正确引用。那么问题出在哪里???

我想也许 Azure 网站没有读取 web.config 的连接字符串。回想我是如何创建 Azure 网站的,我记得我给 Azure SQL DB 赋予了一个别名,该别名与我在 web.config 中的连接字符串的“标签”名称完全相同! 澄清:

  • 在 Azure 管理控制台中,我转到网站设置并查看了“烘焙”到我的 Azure 网站的“连接字符串”设置,这是使用数据库创建网站的副作用——连接字符串“句柄”是“ SsnCustInfoModelContainer”——我错误地为连接赋予了与连接字符串的 web.config 'handle' 相同的 'handle'/'alias',认为这会有所帮助。相反,当 EF 查找连接字符串时,它找到了这个“别名”句柄,这是一个不包含元数据的“普通”SQL 连接字符串。这个“别名”掩盖了 web.config 中指定的真实连接字符串。

所以我销毁了我的 Azure SQL DB 和我的 Azure 网站。然后我重新创建了 Azure 网站,但这次我要求提供“SsnCustInfoModelContainer_Proto”的连接字符串“别名”以连接到关联的 Azure SQL Server。从本地 SQL Server Management Studio 初始化 Azure SQL DB 后,我再次将 WCF Web 应用程序部署到 Azure 网站(当然,为此我必须下载新的部署配置文件),我再次尝试了该应用程序。这次它起作用了——“别名”“SsnCustInfoModelContainer_Proto”与 EF 没有冲突,也没有被 EF 发现。相反,EF 继续在 web.config 中查找真正的连接字符串以及所有正确的元数据。 问题解决了。

于 2013-04-07T04:10:30.180 回答