Контроллер лесов не работает с обновлением 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, и т.д. (у меня нет установленных и он не работает с ЛЮБОЙ проект);

Я изменил/настроил некоторые из шаблонов, но он работал после изменений.

EDIT:

Я удалил обновление Visual Studio 2013 Update 2 и, таким образом, вернулся к Visual Studio версии 12.0.21005.1 REL.

Проблема исчезла. Поэтому проблема совершенно определенно с Update 2.

Вопрос:

Кто-нибудь (включая Microsoft) знает об исправлении?

ИЗМЕНИТЬ 2:

Ответ Farruk Subhani не затрагивает вопрос: в вопросе четко говорится, что удаление ссылок на MVCScaffolding не решает проблему.

Я добавил 200 очков, пожалуйста, задайте вопрос, как четко сказано.

Ответ 1

Для меня работала комбинация вещей:

  • Обновление до версии 5.0 для Visual Studio 3.

  • Обновление платформы Entity Framework до 6.1.1

  • Измените конфигурацию контекста, чтобы использовать IDbSet <... > вместо DbSet <... > (я слышал, что это может повлиять на использование асинхронных действий, но, по-видимому, не в моем случае, поскольку я использую это в мои действия входа и т.д., как поставляется пакетом Nuget для образца ASP.NET Identity 2).

Довольно почему эта комбинация работает, я понятия не имею. Но затем, учитывая грохочущую тишину от MS, я, вероятно, не одинок. Я думаю, обновление 2 просто не сработало...

Ответ 2

Эй, для всех вас, что ничего не работает, реальный ответ: вам нужно удалить НИЧЕГО, у которого есть configSource на web.config, и строка подключения должна быть встроена.

EDIT:

Кто-то отметил, что он должен быть только тегами <configSettings>, <appSettings> и <connectionStrings> NOT, использующими атрибут configSource. И что он все еще мог использовать атрибуты configSource в другом месте, например тег перезаписи.

Я думаю, что инструментарий не может следовать за расположениями configSource для того, что он использует, как строки подключения и настройки приложения.

Microsoft должна быть в этой проблеме, если она еще не исправлена.

ИЗМЕНИТЬ 2:

Даже мысли @awrigley отметили его ответ как правильный, это известная ошибка Visual Studio. Мне удалось это сказать, и я думаю, что скоро это привлечет внимание. https://github.com/aspnet/Tooling/issues/169#issuecomment-144197015

Ответ 3

Пожалуйста, запустите следующую команду в Консоль диспетчера пакетов:

Uninstall-Package EntityFramework -Force

Install-Package EntityFramework

Uninstall-Package  MvcScaffolding

Install-Package MvcScaffolding

Ответ 4

У меня была такая же проблема с обновлением Visual Studio 2013 Update 3, но только для лесов, работающих с Entity Framework. Эта проблема, по-видимому, вызвана несовместимостью между Entity Framework 6.1.0 и файловыми системами в Visual Studio 2013 Update 2 и выше.

Для обновления EF выполните следующие действия:

Uninstall-Package EntityFramework -Force

Install-Package EntityFramework

Этот ответ заимствован из здесь

После обновления леса работают отлично для меня. Обязательно установите новую версию в каждом проекте, где требуется платформа Entity Framework.

Ответ 5

Решение

Убедитесь, что раздел

<connectionStrings>..</connectionStrings>

после

<configSections>..</configSections>

Ответ 6

n В моем случае я решил проблему со строкой подключения в файле web.config.

Предотвращает проблему, я имею

  <connectionStrings configSource="Configs\ConnectionString.config"/>

и я не знаю почему, но vs can not подключается к базе данных и терпит неудачу.

после изменения

<connectionStrings>
    <add name="UIBuilderContext" connectionString="metadata=res:/ ..... " />
  </connectionStrings>

и он работает

Ответ 7

Это может быть полезно для людей, которые не установили пакеты 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
  • Update-Database
  • Я начал веб-сайт, и я мог зарегистрировать пользователя. Все таблицы были созданы правильно.

Затем я создал контроллер с помощью опции scaffolding:

  • щелкните правой кнопкой мыши на "Контроллеры" > "Добавить" > "Контроллер"... > Контроллер MVC 5 с представлениями, используя 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
  • запустил веб-сайт и зарегистрировал пользователя
  • проверили mdf db. Все таблицы есть, поэтому строка подключения работает.
  • щелкните правой кнопкой мыши на "Контроллеры" > "Добавить" > Контроллер... > Контроллер MVC 5 с представлениями, используя Entity Framework. Выбрал мой контекст и класс, который будет использоваться. Это не сработало, и появилась эта всплывающая ошибка:

Произошла ошибка с запуском выбранного генератора кода: "Исключение имеет был брошен мишенью вызова. '

РЕШЕНИЕ:

После некоторого расследования, что я сделал, меняется строка подключения в web.config на начальную на "реальный сервер" (вместо localdb). Я попытался снова создать контроллер с представлениями. Это сработало!

Итак, мне кажется, проблема с строкой связи/ошибка или проблема localdb... не могу это объяснить. Может быть, Visual Studio не нравится то, что я сделал, мне пришлось сохранить мою старую строку подключения...

В любом случае, теперь, когда мне нужны строительные леса, я просто меняю строку подключения на ту, которая работает. Затем, чтобы проверить свой сайт, я верну его обратно в localdb.

Ответ 8

Для меня я должен был обеспечить <configSettings>, <appSettings> и <connectionStrings> теги НЕ с помощью атрибута configSource.

Я все еще мог использовать атрибуты configSource else, где, например, тег rewriter.

Ответ 9

Я думаю, проблема связана с плохой конфигурацией в файле web.config.

В моем случае у меня было несколько <entityFramework> в файле web.config, и проблема решена после того, как я изменил настройки.

Ответ 10

Я нахожусь в 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>

Ответ 11

Я выполнил следующие действия для решения этой проблемы:

  • В диспетчере пакетов проверьте, есть ли MVCScffolding или T4Scaffolding (основной или предварительный выпуск для vs2013)
  • Удалите все упакованные, которые зависят от любого из MVCScaffolding или T4Scaffolding
  • Скопируйте полную папку CopyTemplates (не заменяйте собственные шаблоны, но убедитесь, что у вас есть остальные файлы из корневого каталога этой папки. Я полагаю, что вы сделали эту часть, поскольку вы настроили некоторые шаблоны, чтобы вы знали, где эта папка есть)
  • Постройте свой проект и закройте его.
  • Перезапустите Visual Studio в режиме администратора
  • Откройте консоль диспетчера пакетов (у него не должно быть никаких ошибок, и вы можете увидеть PM > без ошибок.
  • Щелкните правой кнопкой мыши на папке Controller и выберите Add- > New Scaffolding Item или выберите Add- > Controller, и вы должны спросить, какой из них вы хотите, а затем выбрать подставку MVC5 или когда-либо отображаемую в списке.
  • Затем вы сможете выбрать свои параметры, если его контроллеру может потребоваться выбрать DBContext или репозиторий и т.д.

Это создало для меня контроллер и соответствующие взгляды.

Я добавил в эту папку пользовательское частичное представление QuickView, однако эта процедура создания лесов не учитывала это и только сгенерированные представления, которые он делал по умолчанию. Я не уверен, что вам нужно добавить эти пользовательские представления в файл, чтобы сообщить Scaffolder также об их создании.

Ответ 12

Я объясню здесь немного больше на английском, поэтому каждый может понять. Надеюсь, это поможет кому-то там. Это происходит потому, что Visual Studio не удается подключиться к модели базы данных.

Это происходит, когда вы меняете имя и/или путь в классе, который расширяет DbContext и не меняет его в файле Web.config(в самой внешней части вашего проекта: корень).

Пример:

Представьте, что вы закрепили код DbContext:

a) Вы щелкнули правой кнопкой мыши по папке в своем проекте и добавили "ADO.NET Entity Data Model", и вы назвали ее "Model1"

Вы получите следующий код:

  public class Model1 : DbContext
{
    // Your context has been configured to use a 'Model1' connection string from your application 
    // 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; }
}

enter image description here

b) Теперь вы решили, что имя, которое вы только что написали, просто плохо, поэтому вы меняете его на AppContext

Теперь ваш код выглядит следующим образом:

  public class AppContext : DbContext
{
    // Your context has been configured to use a 'AppContext' connection string from your application 
    // 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; }
}

enter image description here

Затем вы пытаетесь подделать CRUD (создавать, читать, обновлять, удалять) операции с представлениями, и это не сработает!

enter image description here

Почему?

Хорошо, если мы перейдем к файлу 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")

enter image description here И есть проблема. Вам нужно изменить Model1 для имени, которое вы выдали!

В этом случае он должен сказать "AppContext" вместо "Model1"

И где он говорит:

initial catalog=Skelleton.Models.Model1;

Убедитесь, что:

  • Это имя файла .cs, у которого есть класс

  • Пространство имен (или серия имен (разделенных точками), которая предшествует имени вашего класса) является правильной. Важно заметить, что вы не добавляете расширение ".cs"; просто имя вашего файла.

Он должен выглядеть так: enter image description here

Поскольку я изменил имя класса, как внутри, так и снаружи (внутри него и его имя), и не изменил его местоположение, я просто переименую его в AppContext

После этого. Вы можете эшафот нормально;)

Надеюсь, это поможет!

Ответ 13

Для меня работала, чтобы убедиться, что <configSections> node в файле web.config был первым node сразу после <configuration> node.

Изначально, когда я добавил мой connectionStrings, я фактически разместил его перед configSections, что заставило инструмент Scaffold сломаться.

Похоже, что когда строительные леса запускаются и пытаются получить информацию о соединении, он ожидает, что раздел конфигурации для entityFramework node уже существует, поэтому он знает, какой поставщик БД использовать, но когда у меня была строка подключения перед конфигурационными разделами, он не знал, как использовать LocalDB (это то, что я использовал в строке подключения).

Ответ 14

У меня была такая же проблема в обновлении 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" />

Постройте проект, и все должно работать. Ура!

Ответ 15

Я запускаю VS 2015RC последним перед окончательным сокращением. Не обесценивать какие-либо решения здесь. Мое решение было связано с менеджером пакетов nugget и обновило мой пакет Microsoft.Aspnet.Mvc 5.2.3 и исправил мою проблему. Я надеюсь, что это поможет любому, кто использует VS 2015.

Ответ 16

Я использовал инициализатор, и когда remove/comment инициализатор из конструктора myDbContext, строительные леса работают нормально

public myDbContext () : base("name=DefaultConnection")
    {

        //Database.SetInitializer(new DropCreateDatabaseIfModelChanges<DastanakDbContext>());
        //Database.Initialize(true);
    }