MVC4脚手架添加控制器给出错误"无法检索元数据......"

Jac*_*eja 24 asp.net-mvc scaffolding asp.net-mvc-4 visual-studio-2012

我正在使用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; }
  }
Run Code Online (Sandbox Code Playgroud)

当我尝试使用内置脚手架创建一个新的控制器时,我收到以下错误:

"无法检索MyThing的元数据"

"不支持使用相同的DbCompiledModel来创建针对不同类型的数据库服务器的上下文.而是为每种使用的服务器创建单独的DbCompiledModel.

如何让脚手架工作?

Jac*_*eja 11

通过反复试验,我发现导致错误的代码行(它是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; }
}
Run Code Online (Sandbox Code Playgroud)

WTF?

  • 这是一个答案,还是问题的一部分? (6认同)

Hen*_*rik 9

在运行有关构建MVC音乐商店应用程序主题的教程时,我也偶然发现了这种症状.

在Visual Studio中肯定存在一个错误.似乎触发此错误的是选择一些用于连接字符串的名称,而不是默认名称.

感谢用户dwaynef http://forums.asp.net/t/1838396.aspx/1找到此解决方法.

有点详细说明,您需要在添加新的脚手架控制器时暂时将连接字符串的名称更改为web.config中的"DefaultConnection":

<connectionStrings>
     <add name="DefaultConnection" ... />
</connectionStrings>
Run Code Online (Sandbox Code Playgroud)

如果您有多个连接字符串 - 请确保在执行操作时只有这一个.


小智 8

这是我的两分钱.我不相信你的解决方案实际上解决了真正的问题.真正的解决方法是将基础构造函数传递给数据库名称而不是连接字符串名称,以便连接字符串为

<add name="MyContext" connectionString="Data Source=|DataDirectory|MyDatabase.sdf" providerName="System.Data.SqlServerCe.4.0" />
Run Code Online (Sandbox Code Playgroud)

你的上下文类应定义为

    public class MyContext : DbContext 
{
    public MyContext() : base("MyDatabase") { }... 
Run Code Online (Sandbox Code Playgroud)

希望这对你和其他人有用,就像它对我一样.


Sol*_*ake 5

这对我有用:

  • 转到web.config中的连接字符串更改以下内容: providerName="System.Data.SqlClient"

代替

providerName="System.Data.SqlServerCe.4.0"

  • 生成您的控制器.
  • 将providerName重命名为" System.Data.SqlServerCe.4.0".
  • 运行你的项目.