MVC中的“添加控制器”出现“无法检索元数据...配置系统初始化失败”的错误。

10
从头开始,我创建了一个新的项目解决方案,其中包含两个项目:一个是MVC 3,另一个是支持EF 4.2的项目。整个解决方案构建成功。从MVC项目中,我打开“添加控制器”对话框,并让它根据我从支持EF项目选择的上下文和模型生成代码。 "添加控制器"对话框失败并显示以下消息:

无法检索'MyModelClass'的元数据。配置系统初始化失败。

我注意到"添加控制器"对话框实际上正在尝试从其web.config文件中获取数据库连接字符串。首先,这让我感到有些愚蠢,因为支持EF项目已经有了一个带有连接字符串的app.config文件。但是不管怎样,我能想到的最好的解释就是web.config中的连接字符串存在问题。它看起来像这样:

<add name="Monsters2Entities" 

    connectionString="
      metadata=res://*/Monsters.csdl|
               res://*/Monsters.ssdl|
               res://*/Monsters.msl;
      provider=System.Data.SqlClient;
      provider connection string=&quot;
        data source=.;
        initial catalog=Monsters2;
        integrated security=True;
        pooling=False;
        multipleactiveresultsets=True;
        App=EntityFramework
      &quot;" 
      providerName="System.Data.EntityClient" 
/>

连接字符串实际上并没有所有荒谬的换行和缩进 - 我只是在尝试让它更易读。无论如何,该连接字符串基本上与支持EF项目中使用的连接字符串相同,因为模型是按照此方式建模的。我该如何纠正这种情况,使"添加控制器"对话框也能够正常工作呢?


你的第二个项目是一个类库项目吗? - Misi
我有一个类似的问题,只是在MVC 4项目中出现了这个错误:_'无法检索“ClassLibrary1.TableName1”的元数据。指定的命名连接在配置中未找到,不打算与EntityClient提供程序一起使用,或者无效。'_ - Misi
试试这个链接,可能对你更有帮助:https://dev59.com/vWox5IYBdhLWcg3wNRpj#14354851 - Jon P
请确保您已经添加了对应的数据库 DLL 的引用,我假设它是“System.Data.SqlServerCE”。它应该位于“%Program Files%\Microsoft SQL Server Compact Edition\v4.0\Desktop”目录下。 - Justin
请查看我在一个描述类似问题的问题上的答案[http://stackoverflow.com/a/17789016/674700]。 - Alex Filipovici
显示剩余2条评论
11个回答

8

我已经安装了EF 6,它添加了以下内容:

<providers>
    <provider invariantName="System.Data.SqlClient" 
        type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>

在我的配置文件中,我遇到了其他的脚手架问题,所以决定回退到Ef 5。在卸载EF 6并重新安装EF 5之后,我删除了配置文件中的标签,然后我就能够构建新的控制器了。我是通过使用

来发现这个问题的。
PM> Update-Database –Verbose

2
只需将你的EF模型项目App.Config中的连接字符串信息复制到你的项目中,并确保不重复任何部分(例如entityFramework部分)。请注意不要删除html标签。

这对我有用。我的MVC5 Web项目正在抱怨连接字符串的元数据。只需从EF6项目的app.config中复制连接字符串行到web.config中即可。然后我就可以添加控制器和脚手架视图了。 - bob

1
我将这段代码添加到我的Global.Asax文件中,以便于a) 数据库能够立即启动并且b) 表定义也被添加了,从而使控制器能够找到表定义:
 System.Data.Entity.Database.SetInitializer<ProjectName.DAL.DBConnectContextName>(new CreateDatabaseIfNotExists<ProjectName.DAL.DBConnectContextName>());

1

试试这个:

<add name="Monsters2Entities" 

    connectionString="
      metadata=res://*/Monsters.csdl|
               res://*/Monsters.ssdl|
               res://*/Monsters.msl;
      provider=System.Data.SqlClient;
      provider connection string='
        data source=.;
        initial catalog=Monsters2;
        integrated security=True;
        pooling=False;
        multipleactiveresultsets=True;
        App=EntityFramework
      '" 
      providerName="System.Data.EntityClient" 
/>

我已经用'替换了&quot;


将编码的 ticks 更改为字面 ticks 并没有解决问题。我认为问题在于语义而不是语法。 - Brent Arias

0

我在遇到这个问题时发现以下方法很有帮助:

卸载预发布版本的EF并安装EF5 进入Sql Server对象资源管理器并删除数据库。 重新构建解决方案 使用PM> Update-Database -Verbose

也许问题出在预发布的EF上,或者只是需要清理一下。

我对这些都很新,但这确实让我可以使用“MVC控制器与读/写操作和评论,使用Entity Framework”模板选择的添加控制器脚手架工具。


欢迎来到So。可能会在回答回复块中提出问题,请为此类查询编写新问题。 - Prahalad Gaggar
谢谢。我并没有提问。只是在尝试提供解决方案,因为我在面对同样的问题时找到了解决方法。 - ajw1970

0

重命名 Model 类 - 对我有用


0
首先,您应该检查您的连接字符串是否在您的Web.Config文件中的ROOT!在您的项目之后,检查是否有另一个连接字符串,如果有另一个连接字符串,请用您的连接字符串替换它....这解决了我的问题,这与您的问题相同....

0

我通过将edmx的代码生成策略更改为T4,添加EF5 Db Context并在*.tt和*.Context.tt文件中替换%edmxInputFile%来解决了我的问题。


0

我在添加控制器时遇到了“无法检索元数据…”的问题。 解决方案如下。

  1. 在连接字符串中将提供程序更改为“system.data.sqlclient” 2.或从Web.config中删除连接字符串,添加控制器,再次添加连接字符串。

这似乎是MVC中的一个错误。 希望这可以帮助你继续前进。


0
你是否确定在创建控制器之前,在Web.Config文件中有一个ConnectionString?有时我们会创建另一个包含Entity DB Context的项目,但却忘记在另一个项目的Web.Config中添加相同的connectionString。
<connectionStrings>
    <add name="Monsters2Entities" ...  />
</connectionStrings>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接