我正在使用VS 2010 Premium。我有一个使用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 对于正在使用的每种类型的服务器。
答案 0 :(得分:29)
我尝试了Fontanka16解决方案,但它没有用,结果发现我的DbContext类缺少定义目标CE数据库的默认构造函数。
以下是我的步骤摘要:
在我的DbContext类中添加了默认构造函数。
公共类 SchoolContext :DbContext { public SchoolContext():base(“ School ”){} ... }
我的连接字符串是:
<add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlServerCe.4.0" />
然后它奏效了。
答案 1 :(得分:9)
我将连接字符串的名称更改回DefaultConnection然后它工作了,我首先尝试添加默认构造函数但收到一些警告,没有正确的程序集引用。
答案 2 :(得分:6)
我是使用EF和MVC的新手,但我发现如果你没有定义数据连接(注释掉)或者在web.config中重命名它,Visual Studio将允许你添加控制器。如果未定义连接,则EF将自动使用SQLExpress。 添加控制器后,您可以将连接字符串添加回web.config,程序将按预期运行。
答案 3 :(得分:5)
您应始终使用base(string)
初始化超类。
还发现Web.config 中connectionString
的名称可能与发送给超类构造函数的String不一样。
例如:
<add name="MovieDBContext" ....... />
public class MovieDBContext : DbContext
{
public MovieDBContext() : base("Movie") { }
}
因此,"MovidDBContect"
与"Movie"
不同。
答案 4 :(得分:2)
这是一个按时间顺序排列的问题而不是错误。 资料来源:来自VôThường的通讯http://www.itorian.com/2012/10/unable-to-retrieve-metadata-for.html
答案 5 :(得分:2)
如果它可以帮助任何人,请注意。 我刚遇到这个问题。
这修正了它: 1.注释掉连接字符串 2.重建没有连接字符串的网站 3.添加控制器 4.取消注释连接字符串 5.重建网站
一切正常。
答案 6 :(得分:2)
在添加带有Entity Framework 6和MySQL数据库的API 2.0 / MVC5控制器时,我遇到了这个问题。
[DbConfigurationType(typeof(MySqlEFConfiguration))]
注释此类属性。 建立项目。 然后添加一个控制器在MySql上为我工作。
添加控制器后取消注释并继续正常。
答案 7 :(得分:1)
这看起来似乎是最愚蠢的事情,但你在其他地方与数据库建立了联系吗?我遇到了同样的问题。我在Server Explorer视图中打开了数据库(我已经连接到我的SDF文件)。一旦我关闭了这个连接,一切都很完美。
答案 8 :(得分:1)
好的,这是我解决问题的邪恶方法。我终于成功了。 Win8 VS2012 EF5 MVC4
答案 9 :(得分:1)
我觉得这是相关的,但我使用上面的解决方案来解决问题并让我再次构建控制器。我之后遇到的问题是,在服务器资源管理器中,我似乎无法找到我的SQL Compact数据库。当我添加应用程序时,它似乎正在工作,但我找不到它。删除构造函数后: public class SchoolContext:DbContext {public SchoolContext():base(“School”){}。
我能够再次看到数据库。我还在开发中,需要添加更多的控制器,所以我必须再次使用它,我想。但这让我整个上午都弄清楚为什么我突然看不到服务器资源管理器中的数据库了。
答案 10 :(得分: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 package。
有关详细信息,请查看此blog entry。