16

我正在使用 VS 2010 高级版。我有一个使用带有实体框架模型的 SqlCe 4.0 的 MVC4 项目。

型号为:

  public class ProjectBuild
    {
       public int ProjectBuildID {get;set;}
       public string name {get;set;}
    }

  public class ProjectBuildContext:DbContext
     {
       public DbSet<ProjectBuild> builds {get;set;}
     }

下面是我的连接字符串:

 add name="ProjectBuildContext" connectionString="Data Source=|DataDirectory|DB.sdf"
 providerName="System.Data.SqlServerCe.4.0"

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

“无法检索 ProjectBuild 的元数据”。“不支持使用相同的 DbCompiledModel 针对不同类型的数据库服务器创建上下文。相反,为正在使用的每种类型的服务器创建单独的 DbCompiledModel。

4

11 回答 11

28

我尝试了 Fontanka16 解决方案,但它不起作用,结果我的 DbContext 类缺少定义目标 CE 数据库的默认构造函数。

这些是我的步骤摘要:

  • 安装了 Nuget 包 EntityFramework.SqlServerCompact。
  • 向我的 DbContext 类添加了默认构造函数。

    公共类SchoolContext : DbContext { public Sc​​hoolContext() : base(" School ") { } ... }

  • 我的连接字符串是:

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

然后它起作用了。

于 2012-09-08T23:57:03.833 回答
9

我将连接字符串的名称改回 DefaultConnection,然后它起作用了,我首先尝试添加默认构造函数,但收到一些关于没有正确程序集引用的警告。

于 2012-10-21T09:47:14.300 回答
6

我是使用 EF 和 MVC 的新手,但我发现如果您没有定义数据连接(将其注释掉)或在 web.config 中重命名它,Visual Studio 将允许您添加控制器。如果未定义连接,则 EF 将自动使用 SQLExpress。添加控制器后,您可以将连接字符串添加回 web.config,程序将按预期运行。

//这个解决方案摘自http://forums.asp.net/t/1838396.aspx/1?Error+while+adding+controller+class+Unable+to+retrieve+metadata+for+MvcMovie+Models+电影+

于 2012-10-11T04:20:00.043 回答
5

您应该始终使用 初始化超base(string)。还发现connectionStringWeb.config中的名称可能与您发送给超类构造函数的字符串不同。

例如:

<add name="MovieDBContext"  ....... />

public class MovieDBContext : DbContext
{
   public MovieDBContext() : base("Movie") { }
}

所以你看, 与"MovidDBContect"不同"Movie"

于 2013-01-11T22:15:17.293 回答
2
  1. 创建控制器
  2. 在 web.config 中添加字符串上下文

这是一个按时间顺序排列的问题,而不是一个错误。来源:来自 Vô Thường 的通讯http://www.itorian.com/2012/10/unable-to-retrieve-metadata-for.html

于 2013-07-07T13:42:30.203 回答
2

如果对任何人有帮助,请注明。我刚遇到这个问题。

这修复了它: 1. 注释掉连接字符串 2. 重建没有连接字符串的网站 3. 添加控制器 4. 取消注释连接字符串 5. 重建网站

一切正常。

于 2014-03-14T03:44:39.797 回答
2

在使用 Entity Framework 6 和 MySQL 数据库添加 API 2.0 / MVC5 控制器时,我遇到了这个问题。

[DbConfigurationType(typeof(MySqlEFConfiguration))]

注释掉这个类属性。构建项目。然后在 MySql 上添加一个控制器对我有用。

Uncomment after controller is added and continue as normal.

于 2016-01-10T18:34:11.237 回答
1

这似乎是最愚蠢的事情,但是您是否与其他地方的数据库建立了连接?我遇到了同样的问题。我在服务器资源管理器视图中打开了数据库(我已经连接到我的 SDF 文件)。关闭此连接后,一切正常。

于 2012-08-31T20:09:09.893 回答
1

好的,这是我对问题的邪恶解决方案。我终于让它工作了。Win8 VS2012 EF5 MVC4

  • 确保已安装 Nuget 包 EntityFramework.SqlServerCompact
  • 首先,不要手动添加 DbContext。相反,使用脚手架菜单中的
  • 当您使用脚手架创建了一个 Controller+Views 后,切换回 web.config 中的旧连接字符串 - 使用 SQL CE 4.0 的那个。然后一切对我来说都很好
于 2012-09-03T21:44:43.277 回答
1

我觉得这是相关的,但我使用上面的解决方案来解决问题并让我再次构建控制器。之后我遇到的问题是在服务器资源管理器中似乎无法找到我的 SQL Compact 数据库。当我添加应用程序时它似乎正在工作,但我找不到它。一旦我删除了构造函数: public class SchoolContext : DbContext { public Sc​​hoolContext() : base("School") { } 。

我能够再次看到数据库。我仍在开发中,需要添加更多控制器,所以我想我将不得不再次使用它。但这花了我整个上午才弄清楚为什么我突然在服务器资源管理器中看不到数据库了。

于 2013-01-31T17:20:11.387 回答
1

如果您使用的是 VS 2012,您还需要告诉 EF 使用 SQL Compact 而不是 localDb。

<entityFramework>
<defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlCeConnectionFactory, EntityFramework">
  <parameters>
    <parameter value="System.Data.SqlServerCe.4.0" />
  </parameters>
</defaultConnectionFactory>

一种更简单的方法是安装EF SQL Compact Nuget 包

有关更多详细信息,请查看此博客条目

于 2013-02-01T06:02:07.880 回答