在Visual Studio 2012中创建Controller时出错

时间:2012-09-07 18:12:00

标签: asp.net sql-server asp.net-mvc

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

我正处于使用Album.cs作为模型类创建StoreManagerController的部分,而MusicStoreEntities.cs作为数据上下文类。

创建Controller时出错:无法检索“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。如果我将解决方案设置中的Target Framework更改为.NET Framework 4,在Visual Studio 2010中打开解决方案,然后创建Controller,它也可以工作。

Visual Studio 2012或连接字符串是一个问题吗?可能与CE4.0和VS2012有一些兼容性问题?

8 个答案:

答案 0 :(得分: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" />

答案 1 :(得分:8)

重复Add Controller in MVC4 not workingMVC4 Scaffolding Add Controller gives error "Unable to retrieve metadata..."

尝试对连接字符串进行注释,并在创建控制器时使用默认值。

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

创建后返回连接字符串。

答案 2 :(得分:3)

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

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

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

public class MusicStoreContext : DbContext 

{     public MusicStoreContext():base(“MvcMusicStore”){} ...

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:2)

是的,这么简单的修复!!删除连接字符串并在创建控制器并构建项目后将其粘贴回来。不需要Server Explorer数据连接。在App_Data SHOW_ALL中,在构建和第一次调试运行之后创建一种.sdf文件。它作为文件加载到Web Hostsite上,而不是SQL DB。

答案 5 :(得分:1)

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

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

答案 6 :(得分: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"/>

答案 7 :(得分:0)

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