Контроллер скаффолдинга не работает с Visual Studio 2013, обновление 2
ПРОБЛЕМА:
Я обновил до Visual Studio 2013 обновление 2, и теперь я не могу эшафот контроллеров.
Проблема не зависит от проекта: когда я пытаюсь создать контроллер, я получаю следующую ошибку во ВСЕХ и ЛЮБЫХ проектах:
There was an error running the selected code generator:
'Exception has been thrown by the target of an invocation.'
Он работал до обновления до Visual Studio 2013, обновление 2.
Погуглил вопрос до смерти, но ни одно из различных предложений не сработало
Например:
Комментирование OnModelCreating в моем контексте;
Удаление пакетов, таких как MvcScaffolding и т. Д. (У меня нет ни одного установленного пакета, и он не работает с ЛЮБЫМ проектом);
Я изменил / настроил некоторые шаблоны, но после изменений он работал.
РЕДАКТИРОВАТЬ:
Я удалил Visual Studio 2013 Update 2 и, таким образом, вернулся к Visual Studio версии 12.0.21005.1 REL.
Проблема исчезла. Таким образом, проблема вполне определенно с обновлением 2.
ВОПРОС:
Кто-нибудь (включая Microsoft) знает об исправлении?
РЕДАКТИРОВАТЬ 2:
Ответ Фаррука Субхани не касается вопроса: в вопросе четко говорится, что удаление ссылок на MVCScaffolding не решает проблему.
Я добавил награду в 200 баллов, пожалуйста, ответьте на вопрос, как указано.
16 ответов
Сочетание вещей сработало для меня:
Обновление до Visual Studio 2013, обновление 3.
Обновите Entity Framework до 6.1.1
Измените конфигурацию контекста, чтобы использовать IDbSet<...> вместо DbSet<...> (я слышал, что это может повлиять на использование асинхронных действий, но не в моем случае, поскольку я использую это в своих действиях при входе в систему и т. Д., в соответствии с примером пакета Nuget для ASP.NET Identity 2).
Почему эта комбинация работает, я понятия не имею. Но затем, учитывая громоподобное молчание от MS, я, вероятно, не одинок. Я думаю, обновление 2 просто не работает...
Привет всем, что ничего не работает, реальный ответ - вам нужно удалить НИЧЕГО, имеющее configSource в web.config, и строка подключения должна быть встроена.
РЕДАКТИРОВАТЬ:
Кто-то указал, что это должно быть только <configSettings>
, <appSettings>
, а также <connectionStrings>
теги НЕ используют атрибут configSource. И что он все еще мог использовать атрибуты configSource в другом месте, такие как тег rewriter.
Я думаю, что инструмент не может следовать расположениям configSource для такого материала, как строки подключения и настройки приложения.
Microsoft должна быть в этом вопросе, если еще не исправлена.
РЕДАКТИРОВАТЬ 2:
Даже мысль, что @awrigley пометил свой ответ как правильный, это известная ошибка Visual Studio. Мне удалось рассказать тогда, и я думаю, что это получит некоторое внимание в ближайшее время. https://github.com/aspnet/Tooling/issues/169
Решение
Убедитесь, что раздел
<connectionStrings>..</connectionStrings>
после
<configSections>..</configSections>
Пожалуйста, выполните следующую команду в консоли диспетчера пакетов:
Uninstall-Package EntityFramework -Force
Install-Package EntityFramework
Uninstall-Package MvcScaffolding
Install-Package MvcScaffolding
У меня была та же проблема с Visual Studio 2013 Update 3, но только для скаффолдеров, работающих с Entity Framework. Эта проблема, по-видимому, вызвана несовместимостью между Entity Framework 6.1.0 и скаффолдерами в Visual Studio 2013 с обновлением 2 и выше.
Для обновления EF сделайте следующее:
Uninstall-Package EntityFramework -Force
Установить-пакет EntityFramework
Этот ответ заимствован отсюда
После обновления у меня нормально работают леса. Обязательно устанавливайте новую версию в каждом проекте, где требуется Entity Framework.
Я думаю, что проблема из-за плохой конфигурации в файле web.config.
В моем случае у меня было несколько <entityFramework>
разделы в web.config, и проблема решена после того, как я изменил настройки.
Это может быть полезно для людей, которые не установили никаких пакетов scaffolding nuget в своем решении.
На самом деле я не установил mvcscaffolding или t4scaffolding и получил то же сообщение об ошибке.
В моем случае проблема / ошибка была вызвана изменением строки подключения.
Вот что у меня было / шаги для воспроизведения.
- Установленная Visual Studio 2013 Community Edition
- Создан проект MVC
- Создан код первой модели
Отредактированная строка подключения для подключения к реальному серверу, например так:
<add name="DefaultConnection" connectionString="server=myserv;database=MyCustomerDB;user id=myuser;password=mypass" providerName="System.Data.SqlClient" />
Затем я включил миграцию через nuget, например так:
- Enable-Миграция
- Add-Migration InitialCreate
- Обновление базы данных
- Я запустил сайт и смог зарегистрировать пользователя. Все таблицы были созданы правильно.
Затем я создал контроллер, используя опцию scaffolding:
- щелкните правой кнопкой мыши "Controllers" > "Add" > Controller... > MVC 5 Controller с представлениями, используя Entity Framework > выберите мой контекст и класс для использования. Это сработало.
Тогда я решил сделать больше изменений кода и начать с нуля:
Я изменил строку подключения следующим образом, чтобы использовать localdb:
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;AttachDbFilename=|DataDirectory|\aspnet-Test-20141126094523.mdf;Initial Catalog=aspnet-Test-20141126094523;Integrated Security=True" providerName="System.Data.SqlClient" />
Затем я продолжил:
- удалил папку миграций
- повторно включили миграцию, используя те же команды, что и выше, в консоли nuget
- запустил сайт и зарегистрировал пользователя
- проверил мдф дб. Все таблицы есть, поэтому строка подключения работает.
- щелкните правой кнопкой мыши на "Controllers" > "Add" > Controller... > MVC 5 Controller с представлениями, используя Entity Framework. Выбрал мой контекст и класс для использования. Это не сработало, и появилась эта всплывающая ошибка:
Произошла ошибка при запуске выбранного генератора кода: "Исключение было выдано целью вызова".
РЕШЕНИЕ:
После некоторого расследования я снова изменил строку подключения в web.config
на исходный на "настоящий сервер" (вместо localdb). Я попытался снова сгенерировать контроллер с представлениями. Это сработало!
Так что мне кажется проблема / ошибка строки соединения или проблема localdb... не могу это объяснить. Может быть Visual Studio не нравится то, что я сделал, мне пришлось сохранить мою старую строку подключения...
В любом случае, теперь, когда мне нужны леса, я просто изменяю строку подключения на ту, которая работает. Затем, чтобы протестировать мой сайт, я изменил его обратно на локальный.
Я на VS 2013 Update 4 и у меня точно такая же проблема. Это работает для меня при перемещении строки подключения из внешнего файла в web.config. Так что, я думаю, вы могли бы убедиться, что не используете атрибут configureSource для connectionString при создании леса.
Мой web.config до и после изменения До:
<connectionStrings configureSource="connectionStrings.config/>
После:
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net configSource="log4net.config" />
<connectionStrings>
<clear/>
<add name="DefaultConnection" connectionString="Data Source=.;Initial Catalog=YourDb;Integrated Security=False;User ID=sa;Password=YourPassword!#;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" />
</connectionStrings>
В моем случае я решил проблему с помощью строки подключения в файле web.config.
Предыдущая проблема у меня есть
<connectionStrings configSource="Configs\ConnectionString.config"/>
и я не знаю почему, но я не могу подключиться к базе данных и потерпеть неудачу.
после изменения
<connectionStrings>
<add name="UIBuilderContext" connectionString="metadata=res:/ ..... " />
</connectionStrings>
и это работает
Я объясню здесь немного больше на английском, чтобы каждый мог понять. Надеюсь, что это кому-нибудь поможет. Это происходит потому, что Visual Studio не может подключиться к модели базы данных.
Это происходит, когда вы изменяете имя и / или путь в классе, который расширяет DbContext и не изменяет его в файле Web.config (в самой внешней части вашего проекта: корне).
Пример:
Представьте, что вы создали леса код DbContext:
а) Вы щелкнули правой кнопкой мыши папку в своем проекте и добавили "Модель данных сущности ADO.NET", и назвали ее "Model1"
Вы получите следующий код:
public class Model1 : DbContext
{
// Your context has been configured to use a 'Model1' connection string from your application's
// configuration file (App.config or Web.config). By default, this connection string targets the
// 'Skelleton.Models.Model1' database on your LocalDb instance.
//
// If you wish to target a different database and/or database provider, modify the 'Model1'
// connection string in the application configuration file.
public Model1()
: base("name=Model1")
{
}
// Add a DbSet for each entity type that you want to include in your model. For more information
// on configuring and using a Code First model, see http://go.microsoft.com/fwlink/?LinkId=390109.
// public virtual DbSet<MyEntity> MyEntities { get; set; }
}
б) Теперь вы решили, что имя, которое вы только что написали, плохо написано, поэтому вы изменили его на AppContext.
Ваш код теперь выглядит так:
public class AppContext : DbContext
{
// Your context has been configured to use a 'AppContext' connection string from your application's
// configuration file (App.config or Web.config). By default, this connection string targets the
// 'Skelleton.Models.AppContext' database on your LocalDb instance.
//
// If you wish to target a different database and/or database provider, modify the 'AppContext'
// connection string in the application configuration file.
public AppContext()
: base("name=AppContext")
{
}
// Add a DbSet for each entity type that you want to include in your model. For more information
// on configuring and using a Code First model, see http://go.microsoft.com/fwlink/?LinkId=390109.
// public virtual DbSet<MyEntity> MyEntities { get; set; }
}
Затем вы пытаетесь очистить операции CRUD (создание, чтение, обновление, удаление) с представлениями, и это не удается!
Это почему?
Хорошо, если мы перейдем к файлу web.config, мы увидим следующую строку:
<add name="Model1" connectionString="data source=(LocalDb)\v11.0;initial catalog=Skelleton.Models.Model1;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
(Эта строка обычно ниже <add name="DefaultConnection"
)
И здесь есть проблема. Вам нужно изменить Model1 на имя, которое вы дали!
В этом случае он должен сказать "AppContext" вместо "Model1"
И где это говорит:
initial catalog=Skelleton.Models.Model1;
Подтвердите это:
Это имя файла.cs, который имеет класс
Пространство имен (или серия имен (разделенных точками) перед именем вашего класса) является правильным. Важно отметить, что вы не добавляете в конец расширение ".cs"; просто имя вашего файла.
Это должно выглядеть так:
Поскольку я изменил имя класса, как внутреннее, так и внешнее (внутри него и его имя файла), и не изменил его местоположение, я просто переименовал его в AppContext
После того, как это было сделано. Вы можете строить леса нормально;)
Надеюсь это поможет!
Для меня я должен был обеспечить <configSettings>
, <appSettings>
& <connectionStrings>
теги НЕ использовали configSource
приписывать.
Я все еще был в состоянии использовать configSource
атрибуты еще где, такие как rewriter
тег.
Я выполнил следующие действия для решения этой проблемы:
- В диспетчере пакетов проверьте, есть ли у вас MVCScffolding или T4Scaffolding (Core или предварительная версия для vs2013)
- Удалите все упакованное, которое зависит от любого из MVCScaffolding или T4Scaffolding
- Полное копирование папки CodeTemplates (не заменяйте свои пользовательские шаблоны, но убедитесь, что у вас есть остальные файлы из корня этой папки. Я полагаю, что вы выполнили эту часть, так как вы настроили некоторые шаблоны, чтобы вы знали, где находится эта папка)
- Создайте свой проект и закройте его.
- Перезапустите Visual Studio в режиме администратора.
- Откройте Консоль диспетчера пакетов (в ней не должно быть ошибок, и вы можете видеть PM> без ошибок).
- Щелкните правой кнопкой мыши папку Controller и выберите Add->New Scaffolding Item или выберите Add->Controller, оба должны спросить, какой из них вы хотите, а затем выберите MVC5 scaffold или который когда-либо появится в списке.
- Затем вы сможете выбрать ваши параметры, если в качестве контроллера вам может понадобиться выбрать DBContext или репозиторий и т. Д.
Это произвело контроллер и соответствующие представления для меня.
Я добавил в эту папку пользовательское частичное представление QuickView, однако эта процедура скаффолдинга не учитывала это, а только генерировала представления, которые она выполняла по умолчанию. Я не уверен, нужно ли вам добавлять эти пользовательские представления в файл, чтобы Scaffolder также генерировал их.
Я использовал Initializer и когда удаляю / комментирую Initializer из конструктора myDbContext, строительные леса работают нормально
public myDbContext () : base("name=DefaultConnection")
{
//Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DastanakDbContext>());
//Database.Initialize(true);
}
У меня возникла та же проблема в обновлении 4. Я обнаружил, что проблема возникла из <configSections></configSections>
не определено имя раздела. Исправление, которое я поместил между тегами, выглядит следующим образом, и все ошибки были исправлены:
<section name="entityFramework"
type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection,
EntityFramework, Version=6.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089" requirePermission="false" />
Постройте проект и все должно работать. Ура!
Я бегу VS 2015RC последний перед финальным выпуском. Не стоит сбрасывать со счетов любое из решений здесь. Мое решение находилось в диспетчере пакетов nugget и обновило мой пакет Microsoft.Aspnet.Mvc 5.2.3, и это исправило мою проблему. Я надеюсь, что это поможет любому, кто использует VS 2015.
Для меня, что работало, чтобы убедиться, что <configSections>
узел в файле web.config был первым узлом сразу после <configuration>
узел.
Первоначально, когда я добавил свой connectionStrings
Я на самом деле поместил его перед configSections
, который заставил инструмент Scaffold сломаться.
Похоже, когда скаффолдинг запускается и пытается получить информацию о соединении, он ожидает, что секция config для узла entityFramework уже существует, поэтому он знает, какой поставщик БД использовать, но когда у меня была строка соединения до configSections, он не знал использовать LocalDB (это то, что моя строка conn использовала).