Структура сущностей работает локально, но не на лазурном
У меня есть веб-проект, который прекрасно работает на местном уровне. Но когда я изменяю строку подключения на опубликованном веб-сайте 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="Server=tcp:[Removed].database.windows.net,1433;Database=MyDB;User ID=[Removed];Password=[Removed];Trusted_Connection=False;Encrypt=True;Connection Timeout=30;"" 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="Server=tcp:[Removed].database.windows.net,1433;Database=MyDB;User ID=[Removed];Password=[Removed];Trusted_Connection=False;Encrypt=True;Connection Timeout=30;"" providerName="System.Data.EntityClient" />
</connectionStrings>
Я протестировал локальный тестовый модуль с этой строкой подключения, и он работает с моего локального компьютера, подключающегося к базе данных SQL Azure. Любая помощь приветствуется.
1 ответ
У меня была именно эта проблема сегодня; я впервые использую Azure. Я вырывал свои волосы, только у меня ничего не осталось. Я наконец понял это, и это, вероятно, та же самая проблема, которую имеет оригинальный плакат здесь.
Так же, как оригинальный плакат, я тестировал в следующих конфигурациях:
- запустил WCF Web App из Visual Studio против локальной БД - успех
- развернул веб-приложение WCF из Visual Studio на локальном IIS, работал с локальной БД - успех
- запустил веб-приложение WCF из Visual Studio для базы данных SQL Azure - успех
- развернул приложение WCF в Azure через Visual Studio, работая с базой данных SQL Azure - FAILURE!!
После прочтения другого поста ( Code First против Database First) я получил подсказку. В этом посте говорится, что если "строка подключения имеет метаданные, EF считает, что это Model First или Database First", но если это "простая строка подключения, EF считает, что это Code First". Я просмотрел развернутый веб-сайт Azure web.config и подтвердил, что строка подключения содержит правильные ссылки на метаданные Model-First. Так в чем была проблема???
Я подумал, что, возможно, веб-сайт Azure не читает строку подключения web.config. Вспоминая о том, как я создал веб-сайт Azure, я вспомнил, что дал SQL-базе данных Azure псевдоним с тем же именем, что и у "метки" строки подключения в web.config!! Чтобы уточнить:
- в консоли администратора Azure я зашел в настройки веб-сайта и просмотрел параметры "строки подключения", "запечатанные" на моем веб-сайте Azure, в качестве побочного эффекта создания веб-сайта с базой данных - строка подключения "дескриптор" был "SsnCustInfoModelContainer" - я ошибочно присвоил соединению тот же 'handle'/'alias', что и у моего web.config 'handle' для строки подключения, полагая, что это поможет. Вместо этого, когда EF ищет строку подключения, он находил этот псевдонимный дескриптор, который представлял собой "простую" строку подключения SQL, не содержащую метаданных. Этот псевдоним маскировал реальную строку подключения, указанную в файле web.config.
Поэтому я уничтожил свою базу данных SQL Azure и свой веб-сайт Azure. Затем я заново создал веб-сайт Azure, но на этот раз я запросил строку псевдонима соединения "SsnCustInfoModelContainer_Proto" для подключения к связанному серверу Azure SQL Server. После инициализации базы данных SQL Azure из моей локальной среды управления SQL Server я снова развернул веб-приложение WCF на веб-сайте Azure (для этого мне, конечно, пришлось загрузить новый профиль развертывания), я попробовал приложение еще раз. На этот раз это сработало - псевдоним "SsnCustInfoModelContainer_Proto" не конфликтовал и не был найден EF. Вместо этого EF продолжил поиск истинной строки подключения со всеми правильными метаданными в файле web.config. Задача решена.