MVC4 Scaffolding Add Controller дает ошибку «Не удается получить метаданные …»

Я использую RTM-версию Windows 8 и VS 2012 Ultimate. У меня есть проект MVC4 с использованием SqlCe 4.0 с каркасной моделью первого сущности кода .

Модель очень проста:

public class MyThing { public int MyThingId { get; set; } public int UserId { get; set; } public string Title { get; set; } public string Address { get; set; } public string Description { get; set; } public DateTime Date { get; set; } } 

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

«Не удалось получить метаданные для MyThing»

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

Как мне заставить строительные леса работать?

В результате проб и ошибок я обнаружил, что строка кода (это DbContext ctor) вызывает ошибку:

 public class MyThingDb : DbContext { // If I comment this constructor out the scaffolding works public MyThingDb() : base("DefaultConnection") { } public DbSet Things{ get; set; } } 

WTF?

Я также наткнулся на этот симптом при запуске учебника по теме создания приложения для музыкального магазина MVC.

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

Я благодарю пользователя dwaynef на http://forums.asp.net/t/1838396.aspx/1 за обнаружение этого обходного пути.

Немного выработав, что вам нужно временно при добавлении нового controllerа леса, измените имя своей строки соединения на «DefaultConnection» в web.config:

    

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

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

  

вы являетесь classом контекста, следует определить как

  public class MyContext : DbContext { public MyContext() : base("MyDatabase") { }... 

Надеюсь, это сработает для вас и других, как для меня.

Вот то, что сработало для меня:

  • Перейти к строке подключения в web.config изменить следующее: providerName="System.Data.SqlClient"

вместо

providerName="System.Data.SqlServerCe.4.0"

  • Создайте свой controller.
  • Переименуйте имя поставщика обратно в « System.Data.SqlServerCe.4.0 ».
  • запустите проект.

Работает для меня: в диалоговом окне «Добавить новый элемент леса» я добавил новый контекст (плюс) с любым именем (для меня «ScaffoldingContext»). Затем работают строительные леса. Просто переименуйте контекст в controllerе.

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

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

  public MyThingDb() : base("name=MyContext") { } 

Проблема может быть из-за отсутствия [NotMapped] в одном из classов модели.

Поскольку я пропустил атрибут, и я был хитрым головой.

 [Display(Name="Logo")] [DataType(DataType.Upload)] [NotMapped] public HttpPostedFileBase Logo { set; get; } 

У меня была аналогичная проблема, но это был не конструктор по умолчанию. Это также происходит, если у вас есть несколько проектов в вашем решении, а ваш «Web», стоящий перед проектом MVC, не ссылается на EntityFramework.

Изменить «Вещи» внутри

 public DbSet Things { get; set; } } 

к «Database1», где «Database1» – это имя файла базы данных на диске, который отображается в вашем файле Web.config как «Database1.sdf»,

Решение, которое сработало для меня, – это передать те же имена базы данных, что и в вашей строке подключения, к базовому constactor вашего classа dbContext.

Я решил это, нажав CTRL + F5, чтобы перестроить мой проект, прежде чем добавлять мой controller.

Иногда это может быть вызвано свойством ассоциации или атрибутом внешнего ключа

Это то, что сработало для меня ..

Я прокомментировал строку соединения с помощью «System.Data.SqlServerCe.4.0», а затем добавил controller с шаблонами лесов.

В вашем контексте classа вы должны прокомментировать DbConfigurationType, когда собираетесь создавать controller с помощью лесов.

 //[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))] public class NameDbContext {} 

MVC 5 / EF 6

возможно, вы можете сделать это в старой версии?

  1. закомментировали строки подключения в web / app.config, затем сохранили
  2. попробуйте создать новый controller и попросите VS создать «новый» элемент dbcontext вместо того, чтобы выбрать тот, который у вас уже есть.
  3. нажмите кнопку create
  4. удалить новый class dbcontext
  5. замените controller dbcontext на ваш
  6. uncomment строки подключения в web / app.config, затем сохранить

работал на меня!

У меня было такое же сообщение об ошибке, но это не было связано с строкой соединения.

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

Например:

 namespace blah.blah.Building public class Building 

Я переименовал свое пространство имен и исправил все способы использования, а затем работали строительные леса t4!


Ее еще одно решение. Возможно, вам сначала придется запускать строительные леса для «зависимых» моделей. Затем проделайте свой путь до сложных моделей, которые имеют много зависимостей.

У меня была аналогичная проблема при попытке создать представление с моего controllerа, используя строительные леса. В диалоговом окне «Создание представления» я просто удалил раскрывающийся список «Контекст данных», а затем созданный механизм лесов.

Interesting Posts

Печать страницы без шума / цвет страницы?

Как изменить разрешение консоли сервера Ubuntu 9.10 на VMWare?

Коэффициент переупорядочения дает разные результаты, в зависимости от того, какие пакеты загружены

MySqlCommand Command.Parameters.Add устарел

Увеличение поля базы данных на 1

Как читать входной stream http

Подавлять предупреждения с помощью mysql из терминала, но пароль написан в сценарии bash

Как сопоставить <cmd> – <shift> -f, чтобы запустить плагин Ack в Vim?

Xcode, дублированный символ _main

Как удалить ненужные элементы в «Этот компьютер» в Проводнике Windows в Windows 8.1

Избегайте сериализации jacksonа на непривлекательных ленивых объектах

Проверьте, содержит ли переменная числовое значение в Javascript?

Как использовать UIPanGestureRecognizer для перемещения объекта? iPhone / IPad

Новые текстовые файлы создаются с заглавными расширениями

Возможно ли изменить схему проверки CSS в VS2010

Давайте будем гением компьютера.