Приложение не может строить элементы

Я создал приложение MVC 5 в VS 2013 Professional, а затем сначала использовал код EF 6.1 с существующей БД в SQL Server Express. Когда я пытаюсь создать представления, я использую «Новый шаблонный элемент…», а затем выбираю «Контроллер MVC 5 с представлениями с использованием Entity Framework». Я выбираю классы модели и контекста и нажимаю ОК. Затем появляется следующее сообщение об ошибке, и код не создается. Я удалил EF Power Tools с той же ошибкой.

Ошибка

Произошла ошибка при запуске выбранного генератора кода: «Целью вызова возникло исключение».

Я также пробовал удалить / переустановить VS 2013 и SQL Server без изменений.

Есть ли другие идеи о том, что может вызвать эту ошибку?


person runamuk0    schedule 10.05.2014    source источник
comment
Единственное, что у меня есть, это то, что некоторые ссылки не указывают на соответствующую версию. Вот тогда я и вижу эти необъяснимые ошибки.   -  person TheNorthWes    schedule 16.05.2014
comment
У меня такая же ошибка. В качестве обходного пути я мог закомментировать любой беглый код api в моем методе DbContext.OnModelCreating() и смоделировать контроллер. Затем я раскомментировал оскорбительные строки и продолжил свой веселый путь.   -  person Albert Bori    schedule 18.05.2014
comment
@AlbertBori Так было и со мной.   -  person chicken    schedule 18.05.2014
comment
@AlbertBori - Это сработало! Спасибо.   -  person runamuk0    schedule 20.05.2014
comment
@AlbertBori - Мне это тоже помогло, спасибо!   -  person Matthew    schedule 20.05.2014
comment
Если у вас возникла эта проблема, напишите нам по адресу [email protected] или [email protected].   -  person Sayed Ibrahim Hashimi    schedule 05.06.2014
comment
@AlbertBori есть хоть какое-то представление о реальной причине этой проблемы? У меня тоже есть эта проблема, и комментарий .AddFromAssembly(Assembly.GetExecutingAssembly()) исправляет ее.   -  person Eonasdan    schedule 30.06.2014
comment
Любой, кто пытается реализовать решение @AlbertBori, сначала создаст проект, в котором находится ваш свободный API, а затем создайте свой контроллер.   -  person Hernan Demczuk    schedule 24.03.2016


Ответы (29)


У меня тоже была эта проблема, я решил проблему, вызвав base.onModelCreating в моем контексте БД

base.OnModelCreating(modelBuilder);
person Mhand7    schedule 28.05.2014
comment
Это устранило проблему для меня. Поместите эту строку кода в самый конец метода OnModelCreating после того, как все объекты будут настроены. VS2013, обновление 4 - person Aaron; 29.05.2015
comment
У меня есть эта строка в моем коде для начала, но у меня все еще возникает ошибка при добавлении новых элементов шаблонов. Используя VS 2013 Update 5 и SQL Server Express 2012 и следуя руководству по адресу asp.net/mvc/overview/getting-started/ - person Stack0verflow; 05.11.2015

В моем случае я переместил строки подключения из Web.config в

<connectionStrings configSource="ConnectionStrings.config"/>

это когда я начал получать ошибку, когда пытался построить.

Произошла ошибка при запуске выбранного генератора кода: «Целью вызова возникло исключение».

Перенос моих строк подключения обратно в Web.config решил мою проблему.

person Developer SPM    schedule 22.07.2014
comment
были повторяющиеся записи строки подключения в моем web.config - person David McSpadden; 06.08.2015
comment
Я объявил строки подключения перед узлом configSections. Таким образом, строительные леса не смогли найти EF. - person Hemant; 05.10.2015
comment
BOOOO MSFT. Это была моя проблема. - person Andy V; 29.03.2016
comment
У меня тоже была строка подключения до ConfigSections. Перемещение его после того, как ConfigSections решило эту проблему для меня. Ваше здоровье !!! - person Jackson Lopes; 19.06.2017
comment
@DavidMcSpadden, братан, ты должен опубликовать свой комментарий как новый ответ. Через несколько часов я решил свою ошибку из-за вас. Спасибо! - person Phi; 24.08.2017
comment
Да, вот и все! Спасибо! Но как без этой боли разделить web.config на 2 файла? - person Tsagana Nokhaeva; 30.01.2018

Это решило проблему для меня,

Добавление throwIfV1Schema: false в базу DbContext

As so:

public MyDbContext() : base("ConectionStringName", throwIfV1Schema: false) { }
person Rewdiz    schedule 25.02.2015
comment
Не забудьте после этого перестроить! - person lordstyx; 01.03.2017

Я столкнулся с той же проблемой при создании контроллера с использованием каркаса с «ASP.NET MVC5 с использованием представлений с Entity Framework».

Проблема заключалась в том, что я указал тег <connectionStrings> перед <configSections> в web.config. установка <connectionStrings> после <configSections> решила проблему.

Я предполагаю, что при формировании шаблонов ASP.NET MVC сначала хочет разрешить Entity Framework, а затем строку подключения, поскольку я предоставил строку подключения ранее, чтобы после разрешения версии Entity Framework он не мог найти строку подключения, поэтому возникла проблема с вызовом .

person Shirajul Mamun    schedule 01.03.2016
comment
У меня есть классы контекста и модели в отдельном проекте, и это тоже сработало для меня. Спасибо. - person Tahir Hassan; 01.05.2018
comment
Это решило проблему для меня в приложении VS 2019 ASP.NET (Full Framework) MVC. Использование Entityframework 6. - person Avinash Barnwal; 26.07.2020

Поздний ответ; но я отправляю эти ответы в надежде, что кто-то сможет использовать этот ответ для решения своей проблемы.

По какой-то причине, если ваша программа НЕ МОЖЕТ прочитать информацию о connectionString (либо из web.config, либо с помощью других средств), тогда будет выдана эта ошибка.

Убедитесь, что действительная информация connectionString извлекается правильно без каких-либо проблем.

person Ashok kumar    schedule 13.10.2014

У меня было такое же сообщение об ошибке. Я попытался добавить новый Data context class из диалогового окна «Добавить контроллер», а затем получил другую ошибку:

There was an error running the selected code generator:
'Sections must only appear once per config file. See the help topic
<locations> for exceptions.

Оказывается, в моем файле web.config было два <connectionStrings> элемента. (Я вставил один из app.config библиотеки классов, содержащей мою модель Entity Framework.)

person n8mob    schedule 11.06.2014
comment
Я часто горжусь тем, что не делаю глупостей. Сегодня это было одним из немногих. Хороший улов и звонок. - person MetalPhoenix; 10.07.2016

В моем случае мне пришлось вернуть конструктор DBContext, просто используя статическую строку подключения, как определено в web.config

Создание шаблонов не работало, когда я использовал динамически создаваемую строку подключения.

public MyContext() : base("name=MyContext") { }
person tr3v    schedule 09.06.2014

У меня была такая же проблема, когда он не добавлял элементы скаффолда, кажется, что удаление entity-framework через консоль диспетчера пакетов nuget работает

Чтобы запустить консоль диспетчера пакетов:

Инструменты -> Диспетчер пакетов NuGet -> Консоль диспетчера пакетов

Удалять:

UnInstall-Package EntityFramework

Чтобы переустановить:

Install-Package EntityFramework

Или в одной команде:

Update-Package -reinstall EntityFramework

Я надеюсь, что это может кому-то помочь, так как мне потребовалось время, чтобы прийти к этому.

person Enzero    schedule 16.09.2014
comment
это сработало для меня, должно быть какое-то изменение конфигурации, которое он вносит (но где, в решении или в одном из файлов конфигурации?) - person sam starobin; 20.02.2015
comment
@JosephCasey Я не знаю, но у вас должна быть какая-то зависимость, которая мешает вам удалить, проверьте, какие пакеты вы установили, и посмотрите, какие зависимости у них есть. Вам придется сначала удалить их перед удалением EntityFramework. - person Enzero; 04.05.2015
comment
@JosephCasey вы случайно используете бета-версию Entity Frameworks, поскольку у нее есть зависимость (EntityFramework.Commands). Возможно, было бы лучше просто использовать текущую версию 6.1.3. - person Enzero; 05.05.2015
comment
У меня EF 6.1.3. Я могу попробовать проверить позже. Я думаю, что более серьезной проблемой был мой устаревший подход. - person Joseph Casey; 05.05.2015

Это может помочь устранить вашу ошибку.

В моем OnModelCreating я делал это для каждого объекта:

modelBuilder.Configurations.Add(new EntityTypeConfiguration<EntityModel>);

Когда я изменил его на следующее, я перестал получать сообщение об ошибке, которое вы получаете.

modelBuilder.Entity<EntityModel>();
person chicken    schedule 19.05.2014
comment
У меня была точно такая же проблема, почему-то ему не нравится класс EntityTypeConfiguration, спасибо! - person Gabriel Sadaka; 09.08.2015

Я безуспешно пробовал большинство из вышеперечисленных.

В конечном итоге сработало:

  1. Удалить ранее созданную динамически строковую запись
  2. Удалить мою модель (сохраняя все контроллеры и представления)
  3. Воссоздайте модель данных сущности ADO.NET - используя то же имя, создав новую запись строки подключения с тем же именем, что и раньше.

Потом все снова заработало, минус 3 часа разработки.

  1. повторно добавить (из резервной копии) все мои атрибуты свойств в классы таблицы / сущности

Кажется, что-то связано с динамически создаваемой строкой подключения и моделью. Буду признателен за любые мысли о том, что могло случиться.

person BigJoeNH    schedule 24.11.2015

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

Предыдущий выпуск, который у меня был <connectionStrings configSource="Configs\ConnectionString.config"/>

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

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

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

и это работает

person Math    schedule 05.08.2014

Мое решение было таким же простым, как вернуть имя строки подключения в моей веб-конфигурации на DefaultConnection. Хотя у моего dbContext другое имя!

Мне потребовалось 2 часа, чтобы выяснить эту чушь!

person DJ.    schedule 20.02.2015

Похоже проблема подключения настройки / несогласованной записи через Web.config. Чтобы решить эту проблему, выполните следующие действия:

Удалите информацию, связанную с подключением (начиная с ‹connectionStrings› из Web.config, и удалите модели, созданные на данный момент.

Теперь сгенерируйте модель, и она добавит новую запись о подключении в Web.config файл. Как только модель будет сгенерирована, создайте решение, а затем начните управлять лесами. это будет работать.

person Manish K Pandey    schedule 13.03.2015

Я тоже столкнулся с этой проблемой, используя VS 2015. Я безуспешно пробовал все остальные решения. Оказалось, что моя строка подключения (хотя сформированная именно так, как MS говорит нам ее формировать) нуждалась в двойном \ для правильной работы.

Вот что НЕ работало:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\V11.0;AttachDbFilename=|DataDirectory|\SquashSpiderDB.mdf;Initial Catalog=SquashSpiderDB;Integrated Security=True" providerName="System.Data.SqlClient" />

и вот на что я его изменил, чтобы генератор кода заработал:

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\\V11.0;AttachDbFilename=|DataDirectory|\SquashSpiderDB.mdf;Initial Catalog=SquashSpiderDB;Integrated Security=True" providerName="System.Data.SqlClient" />

Обратите внимание на двойные символы \ перед V11.0 и именем базы данных.

Надеюсь, это сэкономит время кому-то еще.

ОБНОВЛЕНИЕ

Это заставляет генерацию кода работать, но тогда приложение не запускается, потому что \ V11.0 не является допустимой строкой подключения. Мне кажется, что у MS есть ошибка в генерации кода, когда он анализирует строку подключения. Мне пришлось изменить его обратно на одиночный \ после того, как я запустил генерацию кода, чтобы приложение снова заработало.

ОБНОВЛЕНИЕ 2

После некоторых дополнительных поисков, проведенных моим партнером, мы обнаружили, что на самом деле создание кода мешало нам изменить поле «Исходный каталог». Когда проект был создан мастером, он автоматически установил для исходного каталога значение aspnet--. Затем мы изменили это поле исходного каталога на DB. Это отлично сработало для работающего приложения. Он мог легко попасть в базу данных. Но по какой-то причине это мешает генерации строительных лесов кода. Вернув исходный каталог к ​​тому, что было раньше (aspnet--, строительные леса снова начали работать (без необходимости в \ V11.0).

Надеюсь, что это поможет кому-то в будущем.

person Greg Veres    schedule 19.02.2016
comment
Для меня ваш ответ до двух обновлений решил проблему. Я просто использовал двойную обратную косую черту (\\) вместо одинарной обратной косой черты (\), и, наконец, это сработало, спасибо. - person yibe; 11.08.2018

Проверьте взаимосвязи между объектами или другую проблему проектирования модели. Для тестирования создайте новую модель класса без каких-либо отношений и используйте Scaffold для создания контроллеров и представлений. Работает для меня.

person FVVID    schedule 03.09.2016
comment
Простой совет по проверке отношений привел меня в правильное русло. В моем случае у меня был плохой декоратор [ForeignKey ()] в классе EF. Как только это было исправлено, проблема решена. - person Eric Sassaman; 01.08.2018

Я получал ту же ошибку, когда вносил некоторые изменения в свою модель. Единственный способ, которым я смог разрешить, был 1) остановить / убить процесс 2) очистить решение и восстановить решение

person user3507981    schedule 20.05.2014

Если случайно вы следуете «Приступая к работе с кодом Entity Framework 6, сначала используйте MVC 5» Тома Дайкстры.

Я дважды проверил все, и моя строка подключения идеальна. Чего я не понял, так это того, что я скопировал другой набор appSettings, который у меня уже есть. Смотри ниже

  <appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>

Мой совет - проверьте каждый дюйм Web.config, и я уверен, что это виноват.

person Crismogram    schedule 06.03.2015

В моем случае NuGet добавил в web.config следующего провайдера:

<provider invariantName="System.Data.SqlServerCe.4.0" type="System.Data.Entity.SqlServerCompact.SqlCeProviderServices, EntityFramework.SqlServerCompact"/>

Когда я сменил провайдера на

<provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/>

Это решило проблему (мне потребовалось около 5 часов, чтобы разобраться :-()

person Stefan de Groot    schedule 15.03.2015

У меня была такая же ошибка. Вот две вещи, которые я сделал, чтобы решить эту проблему:

  1. Добавлено имя в базу в моем контексте: base ("name = connectionstringname")
  2. Я сделал ошибку в строке подключения и исправил ее.
person Reonbs    schedule 04.02.2016

Это (я уверен на 99%) проблема строки подключения. Как только я исправил проблему в Web.Config, ошибка исчезла. Сначала я использовал БД в другом проекте, и как только я скопировал первую строку подключения к БД из App.config в web.config (с тем же именем), все заработало, как ожидалось.

person ransems    schedule 22.03.2017

Использование Visual Studio 2015

Обновленный сервер mysql, и в процессе этого mysql для визуальных студий был обновлен с 6.9.7 до 6.9.8

В моем веб-конфиге все еще была ссылка на старую версию 6.9.7.

Вот мой git diff, который решил проблему:

-      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6,Version=6.9.7.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"></provider>
+      <provider invariantName="MySql.Data.MySqlClient" type="MySql.Data.MySqlClient.MySqlProviderServices,MySql.Data.Entity.EF6,Version=6.9.8.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d"></provider>
person Kyle s    schedule 04.02.2016

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

  1. Строка подключения перемещена из файла Web.config.
  2. Имя сервера и пароль перемещены в отдельный файл, указанный в разделе AppSettings файла Web.config.
  3. Использовал SqlConnectionStringBuilder, чтобы собрать элементы вместе, а затем передать его в мой конструктор класса контекста

После этого я не смог создать больше контроллеров. Чтобы решить проблему, мне пришлось ...

  1. Верните полную строку подключения в Web.config И удалите ссылку на файл строки внешнего подключения.
  2. Добавьте конструктор без параметров в мой класс контекста и дайте ему имя моей строки соединения следующим образом: public contextClass() : base("name=connectionStringName") { }

  3. Перестройте решение и снова создайте контроллер, и все заработало!

person starx207    schedule 08.06.2017

все. Я знаю, что немного опаздываю, но думаю, что могу поделиться своим опытом решения этой проблемы.

Я столкнулся с этим сообщением в двух проектах, и в обоих случаях проблема заключалась в строке подключения.

В первом случае это был «Исходный каталог» вместо «Исходный каталог» (отдельно).

Во втором случае имя сервера (параметр источника данных) было неправильным.

Я надеюсь, что это помогает.

С наилучшими пожеланиями.

person Joel Rodrigues    schedule 27.06.2017

По какой-то причине, когда я комментирую раздел oracle.manageddataaccess.client между <configSections> в web.config, это сработало. (VS 2015 и ODT 12)

<configSections>   
    <section name="entityFramework" type" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <!--<section name="oracle.manageddataaccess.client" />-->
</configSections>
person Ryan Walker    schedule 31.07.2017

В моем случае проблема была вызвана файлом настроек внешнего приложения:

<appSettings configSource="appSettings.config" />

Возврат настроек приложения в файл web.config решил проблему.

<appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
</appSettings>
person Eric Scott    schedule 04.08.2017

У меня было такое:

<appSettings configSource="App_Config\Server\AppSettings.config" />
<connectionStrings configSource="bin\Connections.config" />

Пришлось удалить ОБЕИ И снова поставить.

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

Удаление по-прежнему вызывает ту же ошибку.

person RC Cola    schedule 25.04.2019

Использование: VS 2015 Community Edition и EF 6.1.3. Также реализовано: метод Seed с персонализированным классом, настроенный в файле web.config для запуска при каждом изменении модели. Похоже, это связано с некоторой неправильной конфигурацией в файле web.config, в моем случае, как и в некоторых случаях, которые я вижу в этом посте с другими разделами файла, раздел повторялся с другим содержанием, но повторял основной тег конечно. Случай с разделом неуместным, над разделом, также является причиной того же поведения и узкого сообщения при попытке подмости.

person Leskyam    schedule 03.09.2016

Ваш контекстный класс может генерировать исключение.

Я читал книгу «C # 6.0 и .NET 4.6 Framework», и одним из последних упражнений в разделе уровня доступа к данным было добавление журналирования. Ну, я полагаю, это взорвет волшебника эшафота. Видимо права доступа к файлам на sqllog.txt или HttpRuntime не определены ... кто знает. Когда я все это прокомментировал, это снова сработало.

namespace AutoLotDAL.EF
{
    using System.Data.Entity;
    using System.Data.Entity.Infrastructure;
    using System.Data.Entity.Infrastructure.Interception;
    using AutoLotDAL.Interception;
    using AutoLotDAL.Models;
    using System;
    using System.Data.Entity.Core.Objects;
    using System.Web;

    public class AutoLotEntities : DbContext
    {
        //static readonly DatabaseLogger databaseLogger =
        //    new DatabaseLogger($"{HttpRuntime.AppDomainAppPath}/sqllog.txt", true);

        public AutoLotEntities()
            : base("name=AutoLotConnection")
        {
            ////DbInterception.Add(new ConsoleWriterInterceptor());
            //databaseLogger.StartLogging();
            //DbInterception.Add(databaseLogger);

            //// Interceptor code
            //var context = (this as IObjectContextAdapter).ObjectContext;
            //context.ObjectMaterialized += OnObjectMaterialized;
            //context.SavingChanges += OnSavingChanges;
        }

        //void OnObjectMaterialized(object sender,
        //    System.Data.Entity.Core.Objects.ObjectMaterializedEventArgs e)
        //{

        //}

        //void OnSavingChanges(object sender, EventArgs eventArgs)
        //{
        //    // Sender is of type ObjectContext.  Can get current and original values,
        //    // and cancel/modify the save operation as desired.
        //    var context = sender as ObjectContext;
        //    if (context == null)
        //        return;
        //    foreach (ObjectStateEntry item in
        //        context.ObjectStateManager.GetObjectStateEntries(
        //            EntityState.Modified | EntityState.Added))
        //    {
        //        // Do something important here
        //        if ((item.Entity as Inventory) != null)
        //        {
        //            var entity = (Inventory)item.Entity;
        //            if (entity.Color == "Red")
        //            {
        //                item.RejectPropertyChanges(nameof(entity.Color));
        //            }
        //        }
        //    }
        //}

        //protected override void Dispose(bool disposing)
        //{
        //    DbInterception.Remove(databaseLogger);
        //    databaseLogger.StopLogging();
        //    base.Dispose(disposing);
        //}

        public virtual DbSet<CreditRisk> CreditRisks { get; set; }
        public virtual DbSet<Customer> Customers { get; set; }
        public virtual DbSet<Inventory> Inventory { get; set; }
        public virtual DbSet<Order> Orders { get; set; }
    }
}
person Matt Gregory    schedule 31.10.2017

EF 6.1 не поддерживает использование шаблона строительных лесов EF 5 Chares

person Wraza    schedule 20.05.2014