MVC3添加控制器脚手架错误 - 不支持的上下文类型

时间:2012-02-02 17:06:19

标签: asp.net-mvc-3 linq-to-sql controller scaffolding

我正在创建一个新的MVC 3应用程序 采取的步骤:
1.右键单击Models并添加“LINQ to SQL Classes”,添加新模型 2.将表从服务器资源管理器拖动到我的新dbml布局并保存 3.右键单击Controllers-> Add-> Controller
4.输入以下信息:

  

控制器名称: UserController
  模板:具有读/写操作和视图的控制器,使用实体框架
  模型类: aspnet_User(TierPay)
  数据上下文类: AgricultureDataContext(TierPay)
  观点: Razor(VBHTML)

5.单击添加
6.获取以下错误:
不支持的上下文类型。

我用Google搜索并没有找到任何答案。 谢谢!

6 个答案:

答案 0 :(得分:19)

在使用实体数据模型而不是Linq to SQL时遇到此错误。我从现有的SQL Server数据库创建了模型。该问题是由添加控制器对话框中选择错误的数据上下文类引起的。这个值必须是顶级类,在我的例子中,“Entitites”作为名称的一部分。我希望这会有所帮助。

Add new Controller to MVC project From Entity Models

答案 1 :(得分:12)

首次使用Entity Framework Database第一个选项时,此对话框首先令人困惑。

如果您首先使用数据库,那么“模型类”下拉列表和“数据上下文类”下拉列表将显示具有相同的类名。

如果您是,例如,尝试创建绑定到“用户”类型的模型的控制器,可以说您将在模型下拉列表以及“数据上下文”部分中看到“用户”。对话框。

在对话框的“模型类”部分中,您要选择模型(此处示例中的用户)。

在对话框的“数据上下文类”部分中,您不想也选择“用户”。相反,您希望选择EDMX文件中继承自ObjectContext的类。如果您首先使用数据库,下拉列表中将有一个这样的类。您将在列表中看到此类,我不知道为什么其他类在列表中。我认为这可能是微软的一个小UI缺陷。

如果您不知道这个类是什么,只需转到EDMX模型并单击与其关联的designer.cs文件。在此代码的顶部,您将看到从ObjectContext继承的类。这是您要选择的课程。

答案 2 :(得分:3)

当我混合了“模型类”和“数据上下文类”时,我收到了此错误消息。

答案 3 :(得分:0)

我不确定这是否正是您所寻找的......但我自己也发现了同样的错误.. 谷歌没有多大帮助,我最终发现了这个问题。

可能的解决方案:

如果要创建包含扩展到另一个类的EF(实体框架)类的模型,请确保将该构造函数扩展到预期的EF类而不是无意中扩展到模型类文件。

我为糟糕的解释道歉,但我是新来的.. 如果这有帮助,请告诉我。

此致

答案 4 :(得分:0)

我在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,因为它传递的是错误的Type。我不确定它们来自哪里,但是在VS中加载了多个DLL,它们包含上下文类型的实现,但只有其中一个是Derve From DbContext - 所有其他的都是从System.Object派生的。这些虚假类型的程序集位于我的'%localappdata%\ assembly'目录中,因此它们已被某些工具自动生成并加载到VS中。

该错误是由Microsoft.VisualStudio.Web.Mvc.Util.TypeHelper.GetType仅按Type.FullName过滤的事实引起的。为了找到正确的类型,还需要按IsValidContextType()进行过滤。

好的,真的很奇怪。我的DbContext派生类有2个部分类(大多数是由.tt脚本自动生成的,有些是手工制作的)。当我尝试添加一个控制器时,VS将新属性添加到我的partial类中,然后它构建了部分类的那部分(只有手动部分,并且它不使用基类)。然后它将它从模型类的一半构建的DLL加载到内存中,然后它失败了上面的基类检查。

怪异。

底线:尝试删除模型上下文的部分类(如果有的话)。

答案 5 :(得分:0)

我和EF有同样的问题。我正在使用VS 2012 我的理由是......这个自动生成过程(Scaffolding)似乎无法识别部分类概念。

我使用了模型第一种方法,并且我使用了实体的继承。 例如:实体“B”和“C”继承自“A”

所以在我生成的模型类“DataModelContainer”中继承自“DbContext”, 没有“DbSet”和“DbSet”的定义 即:以下两行不存在

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

生成的“DataModelContainer”类我是一个局部类,所以我完成了其他部分,使用了partial class的概念。对于脚手架来说这将是一个问题。

我的解决方法是,删除了我手动添加的部分类。并将“DbSet”和“DbSet”的定义添加到自动生成的类中。 这个解决方案的问题是,当我重新生成模型类时,我必须重复同样的事情。