【问题标题】:Error when creating a Controller in Visual Studio 2012在 Visual Studio 2012 中创建控制器时出错
【发布时间】:2012-09-01 15:27:54
【问题描述】:

我正在尝试学习 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 的兼容性问题?

【问题讨论】:

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


    【解决方案1】:

    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】:

      问题在于使用教程中使用的 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" />
      

      【讨论】:

      • 感谢 casaout,很高兴它有帮助 :)
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        public class MusicStoreContext : DbContext 
        

        { 公共 MusicStoreContext() : base("MvcMusicStore") { }...

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            我现在也只是在这里遵循这个例子:Accessing Your Models Data from a Controller。那里标有粗体字,但我一眼就能飞过它:

            您只需构建解决方案,即可让模型和 DBContext 显示在“添加控制器”向导中!

            【讨论】:

            • 你的解决方案与这个问题有什么关系?
            • @ZoomIn 实际上我有一个类似的问题,似乎相关。本教程的最后一步是提到添加连接字符串...构建项目使 VS 能够将新创建的 DBContext 类型包含到他们的向导中...
            【解决方案7】:

            这可能更容易阅读...... 问题是教程中的连接字符串缺少 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"/>
            

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2015-06-28
                • 1970-01-01
                • 1970-01-01
                • 2013-01-17
                • 1970-01-01
                • 2017-04-28
                • 1970-01-01
                相关资源
                最近更新 更多