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

时间:2012-08-28 18:19:48

标签: asp.net-mvc asp.net-mvc-4 visual-studio-2012 scaffolding

我正在使用Windows 8和VS 2012 Ultimate的RTM版本。我有一个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。

如何让脚手架工作?

17 个答案:

答案 0 :(得分: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; }
}

WTF?

答案 1 :(得分:9)

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

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

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

您需要在添加新的脚手架控制器时暂时将web连接中的连接字符串名称更改为“DefaultConnection”:

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

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

答案 2 :(得分:8)

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

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

你的上下文类应定义为

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

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

答案 3 :(得分:5)

这对我有用:

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

而不是

providerName="System.Data.SqlServerCe.4.0"

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

答案 4 :(得分:4)

适合我: 在&#34;添加新的脚手架项目&#34;对话框,我添加了一个新的上下文(加)与任何名称(对我来说&#34; ScaffoldingContext&#34;)。 然后脚手架工作。只需在Controller中重命名上下文。

答案 5 :(得分:2)

尝试不同的选项后,下面的方法可以解决错误..

如果连接字符串中的名称值与传递给构造函数的值匹配,则可以正常工作。

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

答案 6 :(得分:2)

这有时可能是由关联属性或外键属性

引起的

答案 7 :(得分:2)

问题可能是因为失踪 [NotMapped]属性 在其中一个模型类中。

因为我错过了这个属性而我正在狡猾地说。

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

答案 8 :(得分:1)

尝试使用脚手架从我的控制器创建视图时遇到了类似的问题。在创建视图对话框中,我只是清除了&#34;数据上下文类&#34;下拉,然后脚手架机制措辞很好。

答案 9 :(得分:1)

我在添加控制器之前按CTRL + F5重建项目解决了这个问题。

答案 10 :(得分:1)

对我有用的解决方案是将连接字符串中的相同数据库名称传递给dbContext类的基本constactor。

答案 11 :(得分:1)

改变&#34;事物&#34;在里面

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

要 &#34;数据库1&#34;在哪里&#34;数据库1&#34;是磁盘上数据库文件的名称,该文件在Web.config文件中显示为&#34; Database1.sdf&#34;

答案 12 :(得分:1)

我有类似的问题,但它不是默认的构造函数。如果您的解决方案中有多个项目,并且面向MVC项目的“Web”未引用EntityFramework,也会发生这种情况。

答案 13 :(得分:0)

这对我有用..

我使用'System.Data.SqlServerCe.4.0'注释掉了connectionstring 然后用脚手架模板添加了控制器。

答案 14 :(得分:0)

在您的上下文类中,当您要使用脚手架创建控制器时,您必须注释DbConfigurationType。

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

答案 15 :(得分:0)

MVC 5 / EF 6

也许你可以在旧版本中做到这一点?

  1. 在web / app.config中注释掉连接字符串,然后保存
  2. 尝试创建新的控制器并让VS创建一个&#34; new&#34; dbcontext项而不是选择已有的项
  3. 点击创建
  4. 删除新的dbcontext类
  5. 将控制器dbcontext替换为您的
  6. 在web / app.config中取消注释连接字符串,然后保存
  7. 为我工作!

答案 16 :(得分:0)

我有相同的错误消息,但它与连接字符串无关。

这是一个非常罕见的案例,但希望这会对某人有所帮助。我的模型名称与我的命名空间名称的一个段相同。

例如:

namespace blah.blah.Building

public class Building

我重命名了我的命名空间并修复了所有用法,然后t4脚手架工作了!

她是另一种可能的解决方案。您可能必须首先为“依赖”模型运行脚手架。然后继续前进到具有许多依赖关系的复杂模型。