Я отладил эту проблему в 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, которую он построил из половины класса модели, в память, затем не проходит проверку базового класса, описанную выше.
странно.
Итог: попробуйте удалить частичные классы вашей моделиконтекст, если он у вас есть.