Добавить контроллер в MVC4 не работает

Я использую VS 2010 Premium. У меня есть проект MVC4 с использованием SqlCe 4.0 с каркасной моделью сущности.

Модель:

  public class ProjectBuild
    {
       public int ProjectBuildID {get;set;}
       public string name {get;set;}
    }

  public class ProjectBuildContext:DbContext
     {
       public DbSet<ProjectBuild> builds {get;set;}
     }

Ниже приведена строка подключения:

 add name="ProjectBuildContext" connectionString="Data Source=|DataDirectory|DB.sdf"
 providerName="System.Data.SqlServerCe.4.0"

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

"Невозможно получить метаданные для ProjectBuild". "Используя тот же DbCompiledModel для создания контекстов для разных типов баз данных серверы не поддерживаются. Вместо этого создайте отдельный DbCompiledModel для каждого используемого сервера.

Ответ 1

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

Это сводки моих шагов:

  • Установлен пакет Nuget EntityFramework.SqlServerCompact.
  • Добавлен конструктор по умолчанию в мой класс DbContext.

    открытый класс SchoolContext: DbContext {   public SchoolContext(): base ( " Школа" ) {}   ... }

  • Моя строка подключения:

    <add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0" />
    

Затем он работал.

Ответ 2

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

Ответ 3

Я новичок в использовании EF и MVC, но я обнаружил, что если вы не определяете подключение к данным (закомментируйте это) или переименуйте его в web.config, Visual Studio позволит вам добавить контроллер. Если соединение не определено, EF автоматически будет использовать SQLExpress. После добавления контроллера вы можете добавить строку подключения обратно в web.config, и программа будет функционировать должным образом.

//это решение является выдержкой из http://forums.asp.net/t/1838396.aspx/1?Error+while+adding+controller+class+Unable+to+retrieve+metadata+for+MvcMovie+Models+Movie+

Ответ 4

Вы всегда должны инициализировать суперкласс с помощью base(string). Также выяснилось, что имя connectionString в Web.config может быть не таким же, как строка, которую вы отправляете в суперкомпрессор класса.

Итак, например:

<add name="MovieDBContext"  ....... />

public class MovieDBContext : DbContext
{
   public MovieDBContext() : base("Movie") { }
}

Итак, вы видите, что "MovidDBContect" отличается от "Movie".

Ответ 6

Заметка, если она кому-то помогает. У меня была эта проблема.

Это Исправлено: 1. Комментирование строки подключения 2. Перестроить сайт без строки подключения 3. Добавить контроллер 4. Uncomment Connection String 5. Перестроить сайт

Все работает отлично.

Ответ 7

У меня возникла эта проблема при добавлении контроллера API 2.0/MVC5 с Entity Framework 6 и базы данных MySQL.

[DbConfigurationType(typeof(MySqlEFConfiguration))]

Прокомментировать этот атрибут класса. Построить проект. Затем добавление контроллера работает для меня на MySql.

Uncomment после добавления контроллера и продолжения как обычно.

Ответ 8

Это будет выглядеть как самая тупая вещь, но есть ли у вас соединение с вашей базой данных в другом месте? Я столкнулся с этой же самой точной проблемой. Я открыл базу данных в представлении "Проводник сервера" (я установил соединение с моим SDF файлом). Как только я закрыл это соединение, все работало отлично.

Ответ 9

Хорошо, это мое злое решение проблемы. Я, наконец, заработал. Win8 VS2012 EF5 MVC4

  • Убедитесь, что пакет Nuget EntityFramework.SqlServerCompact установлен
  • Сначала не добавляйте DbContext вручную. Вместо этого используйте меню из леса
  • Когда вы создали один Controller + Views с помощью строительных лесов, вернитесь к своей старой строке соединения в файле web.config - той, которая использует SQL CE 4.0. Тогда все работает отлично для меня.

Ответ 10

Я чувствую, что это связано, но я использовал вышеприведенное решение, чтобы исправить проблему и позволить мне снова создавать контроллеры. Проблема, которая возникла после этого, заключалась в том, что я не мог найти свою базу данных SQL Compact после этого в проводнике сервера. Кажется, он работал, когда я добавил приложение, но я не смог его найти. Как только я удалил конструктор: public class SchoolContext: DbContext {public SchoolContext(): base ( "Школа" ) {}.

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

Ответ 11

Если вы используете VS 2012, вам также нужно будет сказать EF, чтобы использовать SQL Compact вместо localDb.

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="System.Data.SqlServerCe.4.0" />
  </parameters>
</defaultConnectionFactory>

Более простой способ - установить пакет EF SQL Compact Nuget.

Подробнее об этом читайте в в блоге.