2012-12-12 10 views
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 애저 데이터베이스에 연결 내 로컬 컴퓨터에서 작동합니다. 도움을 주시면 감사하겠습니다.

+1

먼저 코드를 사용하고 있습니까? 먼저 모델을 먼저 사용합니까, 아니면 데이터베이스를 먼저 사용합니까? 또한 연결 문자열이 어떻게 표시됩니까 (자격 증명을 생략 할 수 있습니까)? –

+0

연결 문자열은 모델을 어떻게 든 사용하고 있음을 나타냅니다 (모델 우선 또는 데이터베이스 우선). 어떻게 든 코드 우선을 사용하고 있습니까? 실수로 코드 접근법에서 실수로 코드를 사용할 수있는 방법에 대한 블로그 게시물을 찾았습니다. http://blog.oneunicorn.com/2012/02/26/dont-use-code-first-by-mistake/ –

+0

' 코드를 먼저 사용하지 마십시오. 데이터베이스를 먼저 가지고 모델을 생성하는 데 사용했습니다. 나중에 모델을 약간 변경하고 데이터베이스를 업데이트해야했습니다. 리플렉터를 사용하여 DAL dll을 검사했으며 리소스에 csdl, msl 및 ssdl이 있습니다. – Mohsen

답변

15

오늘 나는이 정확한 문제를 겪고있었습니다. Azure에 처음으로 배포했습니다. 나는 머리가 빠져 나갔다. 나는 왼쪽이 없다는 것을 제외하고는. 마침내 알아 냈습니다. 원래 포스터와 같은 문제 일 가능성이 큽니다.

그냥 원래의 포스터처럼, 나는 이러한 구성에서 테스트 :

  • 지역 DB에 대한 비주얼 스튜디오에서 WCF 웹 응용 프로그램을 실행 - 성공
  • 배치 WCF 웹 응용 프로그램의 Visual Studio에서 로컬 IIS에, 로컬 DB에 대해 실행 - 성공
  • 푸른 SQL DB에 대한 비주얼 스튜디오에서 WCF 웹 응용 프로그램을 실행 - 성공
  • WCF 응용 프로그램이 푸른 SQL DB에 대해 실행, Visual Studio를 통해 푸른하기 위해 배포 - 실패를!

다른 게시물 (Code First vs. Database First)을 읽은 후 힌트를 얻었습니다. 이 게시물은 "연결 문자열에 메타 데이터가있는 경우 EF는 모델 우선 또는 데이터베이스 우선이라고 생각하지만"일반 연결 문자열 인 경우 EF는 코드 우선이라고 생각합니다. 배포 된 Azure 웹 사이트의 web.config를 탐색하여 연결 문자열에 Model-First 메타 데이터에 대한 적절한 참조가 있는지 확인했습니다. 그래서 문제가 무엇입니까 ???

아마도 Azure 웹 사이트가 web.config의 연결 문자열을 읽지 않는다고 생각했습니다. Azure 웹 사이트를 만든 방법을 다시 생각해 보면 Azure SQL DB에 web.config의 연결 문자열 'label'과 완전히 동일한 별칭을 부여했습니다. 나는 웹 사이트 설정에 가서 푸른 관리 콘솔에서

  • 및 생성 - 웹 사이트-뿐인데의 부작용으로 내 푸른 웹 사이트 "에 구운"는 "연결 문자열"설정을 검토 :는 명확히하기 위해 DB - 연결 문자열 'handle'은 "SsnCustInfoModelContainer"였습니다 - 실수로 연결 문자열에 'web.config'핸들 '과 동일한'핸들 '/'별칭 '을 지정했는데 이것이 도움이된다고 생각했습니다. 대신 EF가 연결 문자열을 찾을 때 메타 데이터가없는 "일반"SQL 연결 문자열 인이 '별칭이 지정된'핸들을 찾고있었습니다. 이 '별칭'은 web.config에 지정된 실제 연결 문자열을 마스킹합니다.

그래서 저는 Azure SQL DB와 Azure 웹 사이트를 파괴했습니다. 그런 다음 Azure 웹 사이트를 다시 만들었지 만 이번에는 Azure SQL Server와의 연결을 위해 "SsnCustInfoModelContainer_Proto"의 연결 문자열 '별칭'을 요청했습니다.로컬 SQL Server Management Studio에서 Azure SQL DB를 초기화 한 후 Azure 웹 사이트에 WCF 웹 응용 프로그램을 다시 배포했습니다 (물론이 작업을 수행하려면 새로운 배포 프로필을 다운로드해야했습니다). 다시 시도했습니다. 이번에는 작동했습니다 - '별칭' "SsnCustInfoModelContainer_Proto"와 (와) 충돌하지 않았으며 EF에서 찾지 못했습니다. 대신 EF는 web.config에서 모든 적절한 메타 데이터가 포함 된 실제 연결 문자열을 찾으려고했습니다. 문제가 해결되었습니다.

+0

귀중한 시간을 절약 해 주셨습니다 ... 다시 한번 감사드립니다. –

+0

@Nathan Watson, 내가 설명한 것과 같은 해결책을 시도했습니다. 하지만 여전히 작동하지 않습니다. EF 용 POCO Templating을 사용했기 때문에 컨텍스트 파일은 비즈니스 계층 proj에 있고 tt 파일은 eniity 프로젝트에, dbmx는 다른 프로젝트에 있습니다. 메인 MVC 프로젝트의 web.config에서 하늘색 연결 문자열을 구성했습니다. 로컬에서 완벽하게 실행되고 있지만 하늘색에 게시하는 동안 하늘색 db에는 연결되지 않습니다. 자세한 내용은 게시 된 질문을 참조하십시오. http://stackoverflow.com/questions/29797153/issue-after-uploading-to-azure-with-ef-unable-to-load-the-specified-metadata-res. – KomalJariwala

관련 문제