实体框架在本地工作,但不在azure上工作

时间:2012-12-12 12:57:16

标签: sql entity-framework-4 azure

我有一个在本地完美运作的网络项目。 但是,当我在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数据库的本地计算机上运行。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:15)

我今天遇到了这个问题;这是我第一次部署到Azure。我一直把头发拉出来,除非我没有留下任何东西。 我终于明白了,这可能与原版海报的问题相同。

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

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

在阅读了另一篇文章(Code First vs. Database First)后,我得到了一个提示。那篇文章说如果&#34;连接字符串有元数据,EF认为它是Model First或Database First&#34;但如果它是一个普通的连接字符串,那么EF认为它是Code First。&#34;我浏览了部署的Azure Web站点的web.config,并确认连接字符串具有对Model-First元数据的正确引用。那问题是什么?

我认为也许Azure网站没有读取web.config的连接字符串。回想一下我是如何创建Azure网站的,我记得我给Azure SQL DB一个别名,其名称与我的连接字符串的名称相同&#39; s&#39;标签&#39;在web.config !! 澄清:

  • 在Azure管理控制台中,我转到了网站设置并查看了&#34;连接字符串&#34;设置&#34;烘焙&#34;到我的Azure网站作为创建网站与数据库的连接效果 - 连接字符串&#39;处理&#39; &#34; SsnCustInfoModelContainer&#34; - 我错误地给出了相同的连接&#39;别名&#39;别名&#39;作为我的web.config&#39;处理&#39;对于连接字符串,认为这会有所帮助。相反,当EF查找连接字符串时,它发现了这个别名&#39;处理,这是一个&#34;平原&#34; SQL连接字符串不包含元数据。这个别名&#39;屏蔽了web.config中指定的真实连接字符串。

所以我销毁了我的Azure SQL数据库和我的Azure网站。然后我重新创建了Azure网站,但这次我要求连接字符串&#39;别名&#39; &#34; SsnCustInfoModelContainer_Proto&#34;用于连接到关联的Azure SQL Server。在从我的本地SQL Server Management Studio初始化Azure SQL DB之后,我再次将WCF Web应用程序部署到Azure Web站点(当然,我必须下载新的部署配置文件才能执行此操作),我再次尝试了该应用程序。这次它起作用了 - &#39;别名&#39; &#34; SsnCustInfoModelContainer_Proto&#34;与EF没有冲突,也没有找到。 EF改为继续在web.config中找到所有正确元数据的真正连接字符串。问题已解决。