14

我正在尝试学习 ASP.NET MVC,所以我正在关注 asp.net 网站上的音乐商店教程。

我正在使用 Album.cs 作为模型类和 MusicStoreEntities.cs 作为数据上下文类来创建 StoreManagerController。

创建控制器时的错误是:无法检索“MvcMusicStore.Models.Album”的元数据。不支持使用相同的 DbCompiledModel 针对不同类型的数据库服务器创建上下文。相反,为正在使用的每种类型的服务器创建一个单独的 DbCompiledModel。

听起来我正在使用两个不同的数据库,但这是来自 Web.config 的连接字符串部分:

<connectionStrings>
<add name="MusicStoreEntities" providerName="System.Data.SqlServerCe.4.0" connectionString="Data Source=|DataDirectory|\MvcMusicStore.sdf"/>
</connectionStrings>

奇怪的是,如果我注释掉 MusicStoreEntities 连接字符串,然后尝试创建它可以工作的 StoreManagerController。如果我将解决方案设置中的目标框架更改为 .NET Framework 4,在 Visual Studio 2010 中打开解决方案,然后创建控制器,它也可以工作。

那么这是 Visual Studio 2012 或连接字符串的问题吗?也许与 CE4.0 和 VS2012 存在一些兼容性问题?

4

8 回答 8

19

问题在于使用教程中使用的数据库的 CE 版本。当切换到 SQL Server 2012 等其他数据库版本时,它对我来说效果很好。尝试这个:

更改此连接字符串

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

 <add name="MusicStoreEntities" connectionString="Data Source=DBInstanceName;Initial Catalog=MvcMusicStore;Integrated Security=True" providerName="System.Data.SqlClient" />
于 2012-11-14T10:05:38.903 回答
8

MVC4中添加控制器的重复不起作用MVC4 脚手架添加控制器给出错误“无法检索元数据...”

尝试注释您的连接字符串并在创建控制器时使用默认值。

<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=MvcMusicStore;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\MvcMusicStore.mdf" providerName="System.Data.SqlClient" />

创建后返回您的连接字符串。

于 2012-09-08T21:05:57.160 回答
3

在您的派生上下文类中,您需要将数据库名称传递给基本构造函数,而不是连接字符串名称,这对于大多数遇到此问题的人来说似乎是混淆的根源,因此在您使用连接字符串的情况下

注意:还删除了 MvcMusicStore.sdf 之前的反斜杠,因为不确定是否有必要

你派生的上下文类应该定义为

public class MusicStoreContext : DbContext 

{ public MusicStoreContext() : base("MvcMusicStore") { }...

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

于 2013-01-29T07:11:10.527 回答
2

我想我找到了解决方法。在生成新控制器之前,请从 Web.config 中删除连接字符串。这将允许您生成控制器而不会出错。然后把连接字符串放回去。这将允许您运行应用程序。

我正在使用 SQL CE4,并且我没有 DbContext 的显式构造函数(MusicStoreEntities 使用上面的示例)。我的连接字符串与 DbContext 类名匹配。

于 2012-11-25T19:54:24.983 回答
2

是的,如此简单的修复!!..在创建控制器并构建项目后删除连接字符串并将其粘贴回去。服务器资源管理器数据连接不是必需的。在 App_Data SHOW_ALL 中,在构建和第一次调试运行后会创建一种 .sdf 文件。它作为文件加载到 Web 主机站点,而不是 SQL DB。

于 2013-10-22T15:22:51.987 回答
1

我现在也在关注这个例子:Accessing Your Models Data from a Controller。它在那里被标记为粗体,但我一眼就能飞过它:

您只需要构建解决方案才能让模型和 DBContexts 显示在“添加控制器”向导中!

于 2013-08-06T20:27:29.887 回答
1

这可能更容易阅读......问题是教程中的连接字符串缺少 sdf 文件名前面的“/”。

坏的:

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

好的:

<add name="MusicStoreEntities"
connectionString="Data Source=|DataDirectory|/MvcMusicStore.sdf"
providerName="System.Data.SqlServerCe.4.0"/>
于 2013-09-24T23:35:05.203 回答
0

删除连接字符串也对我有用,只需在创建控制器并构建项目后将其粘贴回来

于 2013-02-15T08:27:13.523 回答