Подтвердить что ты не робот

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; }
  }

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

"Невозможно получить метаданные для MyThing"

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

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

4b9b3361

Ответ 1

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

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

    public DbSet<MyThing> Things{ get; set; }
}

WTF?

Ответ 2

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

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

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

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

<connectionStrings>
     <add name="DefaultConnection" ... />
</connectionStrings>

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

Ответ 3

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

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

вы являетесь классом контекста, который должен быть определен как

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

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

Ответ 4

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

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

вместо

providerName="System.Data.SqlServerCe.4.0"

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

Измените "Вещи" внутри

public
DbSet<MyThing> Things
{ get; set; }
}

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

Ответ 10

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

Ответ 11

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

Ответ 12

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

Ответ 13

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

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

Ответ 14

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

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

Ответ 15

MVC 5/EF 6

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

  • закомментировал строки подключения в файле web/app.config и сохранил
  • попробуйте создать новый контроллер и VS создадим "новый" элемент dbcontext вместо того, чтобы выбрать тот, который у вас уже есть.
  • нажмите кнопку create
  • удалить новый класс dbcontext
  • замените контроллер dbcontext на свой
  • раскомментировать строки соединения в web/app.config и сохранить

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