25

我正在使用 RTM 版本的 Windows 8 和 VS 2012 Ultimate。我有一个使用 SqlCe 4.0 和代码优先实体框架模型的 MVC4 项目。

模型很简单:

   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。

如何让脚手架工作?

4

17 回答 17

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; }
}

怎么回事?

于 2012-08-28T18:30:38.910 回答
9

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

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

感谢http://forums.asp.net/t/1838396.aspx/1上的用户 dwaynef找到了这个解决方法。

在添加新的脚手架控制器期间,您需要稍微详细说明一下,在 web.config 中将连接字符串的名称更改为“DefaultConnection”:

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

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

于 2012-12-07T09:14:59.500 回答
8

这是我的两分钱。我不相信您的解决方案实际上解决了真正的问题。真正的解决方法是向基本构造函数传递数据库名称而不是连接字符串名称,因此如果您的连接字符串是

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

你的上下文类应该定义为

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

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

于 2013-01-29T05:25:33.540 回答
5

这对我有用:

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

代替

providerName="System.Data.SqlServerCe.4.0"

  • 生成你的控制器。
  • 将 providerName 重命名为 " System.Data.SqlServerCe.4.0"。
  • 运行你的项目。
于 2013-06-04T23:01:00.713 回答
4

对我有用:在“添加新的脚手架项目”对话框中,我添加了一个具有任何名称的新上下文(加号)(对我来说是“ScaffoldingContext”)。然后脚手架工作。只需在 Controller 中重命名上下文即可。

于 2015-12-05T13:15:41.523 回答
2

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

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

 public MyThingDb()
        : base("name=MyContext")
    {
    }
于 2013-03-17T11:06:09.470 回答
2

问题可能是因为 [NotMapped]模型类之一中缺少属性。

因为我错过了这个属性,我很狡猾。

[Display(Name="Logo")]
[DataType(DataType.Upload)]
[NotMapped]
public HttpPostedFileBase Logo { set; get; }
于 2014-08-15T08:51:21.103 回答
2

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

于 2016-12-13T14:20:22.053 回答
1

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

于 2014-04-29T16:43:27.613 回答
1

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

于 2013-01-28T05:04:44.040 回答
1

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

于 2013-07-26T08:58:35.287 回答
1

改变里面的“东西”

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

到“Database1”,其中“Database1”是磁盘上数据库文件的名称,在您的Web.config文件中显示为“Database1.sdf”

于 2013-05-02T10:02:07.193 回答
1

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

于 2018-06-12T13:37:34.343 回答
0

这对我有用..

我使用“System.Data.SqlServerCe.4.0”注释掉了连接字符串,然后使用脚手架模板添加了控制器。

于 2014-03-07T07:33:48.697 回答
0

MVC 5 / EF 6

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

  1. 注释掉 web/app.config 中的连接字符串然后保存
  2. 尝试创建新控制器并让 VS 创建一个“新”dbcontext 项,而不是选择您已有的
  3. 点击创建
  4. 删除新的 dbcontext 类
  5. 用你的替换控制器 dbcontext
  6. 取消注释 web / app.config 中的连接字符串,然后保存

为我工作!

于 2017-10-19T14:18:07.193 回答
0

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

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

例如:

namespace blah.blah.Building

public class Building

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


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

于 2018-04-13T14:01:32.007 回答
0

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

//[DbConfigurationType(typeof(MySql.Data.Entity.MySqlEFConfiguration))]
public class NameDbContext 
{}
于 2016-03-15T16:41:57.670 回答