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
возможно, вы можете сделать это в старой версии?
- закомментировали строки подключения в web / app.config, затем сохранили
- попробуйте создать новый controller и попросите VS создать «новый» элемент dbcontext вместо того, чтобы выбрать тот, который у вас уже есть.
- нажмите кнопку create
- удалить новый class dbcontext
- замените controller dbcontext на ваш
- uncomment строки подключения в web / app.config, затем сохранить
работал на меня!
У меня было такое же сообщение об ошибке, но это не было связано с строкой соединения.
Это очень редкий случай, но, надеюсь, это поможет кому-то. Мое имя модели было таким же, как один из сегментов моего имени пространства имен.
Например:
namespace blah.blah.Building public class Building
Я переименовал свое пространство имен и исправил все способы использования, а затем работали строительные леса t4!
Ее еще одно решение. Возможно, вам сначала придется запускать строительные леса для «зависимых» моделей. Затем проделайте свой путь до сложных моделей, которые имеют много зависимостей.
У меня была аналогичная проблема при попытке создать представление с моего controllerа, используя строительные леса. В диалоговом окне «Создание представления» я просто удалил раскрывающийся список «Контекст данных», а затем созданный механизм лесов.