Ошибка добавления контроллера MVC3 - неподдерживаемый тип контекста - PullRequest
9 голосов
/ 02 февраля 2012

Я создаю новое приложение MVC 3.
Предпринятые шаги:
1. Добавили новую модель, щелкнув правой кнопкой мыши по Моделям и добавив «LINQ to SQL Classes»
2. Перетаскивали таблицы из обозревателя серверав мой новый макет dbml и сохранил
3. Щелкните правой кнопкой мыши Controllers-> Add-> Controller
4. Введите следующую информацию:

Имя контроллера: UserController
Шаблон: Контроллер с действиями чтения и записи и представлениями с использованием Entity Framework
Класс модели: aspnet_User (TierPay)
ДанныеКласс контекста: farmingDataContext (TierPay)
Просмотров: Razor (VBHTML)

5.Нажмите Добавить
6.Получите следующую ошибку:
Неподдерживаемый тип контекста.

Я погуглил и не нашел ответов.Спасибо!

Ответы [ 6 ]

19 голосов
/ 30 мая 2012

Я получал эту ошибку при работе с Entity Data Model вместо Linq to SQL. Я создал модель из существующей базы данных SQL Server. Проблема была вызвана неправильным выбором класса контекста данных в диалоговом окне «Добавить контроллер». Этими значениями должен быть класс верхнего уровня, в моем случае тот, в котором «Entitites» является частью имени. Надеюсь, это поможет.

Add new Controller to MVC project From Entity Models

12 голосов
/ 05 ноября 2012

Этот диалог сначала сбивает с толку при использовании первого варианта Entity Framework Database.

Если вы сначала используете БД, то и выпадающий список «класс модели», и выпадающий список «класс контекста данных» будут иметь одинаковые имена классов.

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

В части диалога "модель класса" вы хотите выбрать модель (здесь пользователь в нашем примере).

В части диалога «Класс контекста данных» вы также не хотите выбирать «Пользователь». Вместо этого вы хотите выбрать класс в вашем файле EDMX, который наследуется от ObjectContext. В раскрывающемся списке будет один такой класс, если вы сначала используете БД. Вы увидите этот класс в списке, и я понятия не имею, почему другие классы в списке. Я думаю, что это может быть небольшим дефектом пользовательского интерфейса от Microsoft.

Если вы не знаете, что это за класс, просто перейдите к своей модели EDMX и щелкните связанный с ним файл designer.cs. В верхней части этого кода вы увидите класс, который наследуется от ObjectContext. Это класс, который вы хотите выбрать.

3 голосов
/ 19 января 2013

Я получил это сообщение об ошибке, когда смешал «класс модели» и «класс контекста данных».

0 голосов
/ 26 июня 2013

У меня такая же проблема с EF.Я использую VS 2012 Причиной для моего случая было то, что этот процесс автоматической генерации (Scaffolding), по-видимому, не распознает концепцию частичного класса.

Я использовал первый подход к модели и использовал наследование с сущностями.Например: сущность «B» и «C» наследуется от «A»

Так что в моем сгенерированном классе модели «DataModelContainer», который наследуется от «DbContext», нет определения для «DbSet» и «DbSetТо есть: следующие две строки отсутствовали

public DbSet<B> B { get; set; }
public DbSet<C> C { get; set; }

Сгенерировал «DataModelContainer» класс I частичный класс, поэтому я завершил другую часть, используя концепцию частичного класса.И это было бы проблемой для Scaffolding.

Мой обходной путь был, только удалил частичный класс, который я добавил вручную.И добавил определения «DbSet» и «DbSet» в автоматически сгенерированный класс.Проблема с этим решением заключается в том, что я должен повторить то же самое при регенерации классов моделей.

0 голосов
/ 02 марта 2013

Я отладил эту проблему в WinDbg, и она вызвана следующим Microsoft.VisualStudio.Web.Mvc.Scaffolding.BuiltIn.EntityFrameworkServices методом:

internal static bool IsValidContextType(Type contextType)
{
    return (typeof(ObjectContext).IsAssignableFrom(contextType) || ((contextType.BaseType != null) && contextType.BaseType.FullName.Equals("System.Data.Entity.DbContext", StringComparison.OrdinalIgnoreCase)));
}

Этот метод возвращает false, поскольку ему передан неправильный тип.Я не уверен, откуда они берутся, но в VS загружено несколько библиотек DLL, которые содержат реализации типа контекста, но только одна из них является производной от DbContext - все остальные являются производными от System.Object.сборки этих фиктивных типов находятся в моем каталоге «% localappdata% \ assembly», поэтому они были автоматически сгенерированы каким-либо инструментом и загружены в VS.

Ошибка вызвана тем, что Microsoft.VisualStudio.Web.Mvc.Util.TypeHelper.GetTypeтолько фильтры по Type.FullName.чтобы найти правильный тип, также необходимо отфильтровать по IsValidContextType().

Хорошо, происходит нечто действительно странное.У меня есть 2 частичных класса для моего класса, полученного из DbContext (большинство из них автоматически генерируются сценарием .tt, а некоторые - вручную).Когда я пытаюсь добавить контроллер, VS добавляет новые свойства в мой частичный класс, затем он строит эту часть частичного класса (только ручную часть и не использует базовый класс).затем он загружает ту DLL, которую он построил из половины класса модели, в память, затем не проходит проверку базового класса, описанную выше.

странно.

Итог: попробуйте удалить частичные классы вашей моделиконтекст, если он у вас есть.

0 голосов
/ 03 февраля 2012

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

Возможное решение:

Если вы создаете модель, которая содержит класс EF (Entity Framework), который распространяется на другой класс ... убедитесь, что вы расширяете этот конструктор до предполагаемого класса EF, а не от файла класса модели непреднамеренно ..

Я прошу прощения за плохое объяснение, но я новичок в этом .. Дайте мне знать, если это поможет.

С уважением

...