21

我正在从 Microsoft 的教程中学习 ASP.NET MVC:

http://www.asp.net/mvc/tutorials/getting-started-with-aspnet-mvc3/cs/accessing-your-model's- https://stackoverflow.com/editing-helpdata-from-a- _控制器

在上面提到的链接中,在添加一个名为“MoviesController”的控制器时,我收到了这个错误

“无法检索 'MvcMovie.Models.Movie' 的元数据。不支持使用相同的 DbCompiledModel 针对不同类型的数据库服务器创建上下文。相反,为正在使用的每种类型的服务器创建一个单独的 DbCompiledModel”

我该如何解决?

4

13 回答 13

25

我遇到过同样的问题。

providerName="System.Data.SqlServerCe.4.0"我用切换providerName="System.Data.SqlClient",它创建了控制器和视图。

我发现了这个:http: //msdn.microsoft.com/en-US/library/ms171861.aspx

我按照指示添加了对 SQL Server Compact 的引用,但它仍然不起作用。

我还尝试注释掉默认的 SQL Server Express 连接,但在尝试添加控制器时仍然出现相同的错误。

我只是打算使用 SQL Server Express。如果我有任何问题,我会告诉你。

于 2012-09-19T22:00:58.990 回答
6

我发现使用以下方法:(假设您安装了 SQL Server Express 或更高版本)

 <add name="MovieDBContext" providerName="System.Data.SqlClient" connectionString="Data Source=(LocalDb)\v11.0;AttachDBFilename=|DataDirectory|MovieDB.sdf"/>
于 2012-11-28T01:55:31.017 回答
2

我认为这个错误的原因是因为 VS 在搭建脚手架时难以重用现有的 DBContext。VS 尝试在 DBContext 中使用具有相似域名称的属性(例如尝试连接“s”的域名)。如果它找不到该属性并且您的上下文已经有一个带有您的 Domain 类的 DBSet,它会生成该错误。

我的解决方案是创建一个名为“DeleteContext”的新 DBContext。成功创建控制器和视图后,我已将控制器中的“DeleteContext”替换为现有的。最后我删除了“DeleteContext”类。

它工作得很好。

于 2014-03-31T00:44:06.090 回答
1

我在使用 Visual Studio 2012 ( http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-5 )时在另一个 Microsoft ASP.NET MVC 教程中遇到了同样的错误. 我决定,为了完成本教程,使用 SQL Express 代替 SQL CE 会更容易。

我为解决这个问题所做的是从服务器资源管理器中删除 MvcMusicStore.sdf,然后从解决方案资源管理器中的 App_Data 中删除相同的数据库文件。

我更新了 Web.config 中的连接字符串部分,以使用 Sql Express 数据库 (.mdf) 代替 Sql CE (.sdf)。对于这个特定的教程,MusicStoreEntities是扩展类的名称DbContext

<connectionStrings>
    <add name="MusicStoreEntities" connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\MvcMusicStore.mdf;Integrated Security=True" providerName="System.Data.SqlClient"/>
</connectionStrings>

我构建了解决方案,运行了站点,并为我重新生成了数据库。要将数据库文件添加回解决方案,请单击解决方案资源管理器中的“显示所有文件”按钮,右键单击 App_Data 中的 .mdf 文件,然后选择“包含在项目中”。

于 2013-02-14T20:04:02.463 回答
1

嗨,有一个对我来说很好的解决方案。在您的 Web.config 中,教程告诉您在该部分中添加以下行connectionStrings

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

不要删除或更改它!

当您添加新控制器时,您可以这样做以避免出现的错误:

  1. 评论上面的行。
  2. 添加以下行: <'add name="SchoolContext" connectionString="Data Source=|DataDirectory|School.sdf" providerName="System.Data.SqlClient"/>
  3. 保存您的解决方案
  4. 添加控制器
  5. 在运行您的应用程序之前,取消注释您已注释的行 (1),并注释您添加的行(带有 的行providerName="System.Data.SqlClient")(2)。

添加控制器时,这对我来说非常好。

希望这可以帮助你。

于 2013-05-14T02:45:20.573 回答
1

该解决方案对我不起作用,它继续存在return View(db.Movies.ToList());

而是使用这个:

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

和这个:

public class MovieDBContext : DbContext
{
   public MovieDBContext() : base("Movie") { }
   public DbSet<Movie> Movies { get; set; }
} 
于 2012-09-20T16:06:55.250 回答
0

我在阅读 Contoso University asp.net MVC 教程时遇到了同样的问题。问题似乎来自将 SQL Server Compact 连接字符串与成员资格提供程序 Sql Server 连接混合。

我最初使用了 hyperGeoMetric 的修复程序,并且确实有效。然后我查看了可下载代码的 web.config 并注意到了一些额外的配置。

如果您使用以下内容添加/替换 entityFramework 的默认参数:

<parameters>
        <parameter value="Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True" />
</parameters>

添加一个 system.data 部分,如下所示:

<system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SqlServerCe.4.0" />
      <add name="Microsoft SQL Server Compact Data Provider 4.0" invariant="System.Data.SqlServerCe.4.0" description=".NET Framework Data Provider for Microsoft SQL Server Compact" type="System.Data.SqlServerCe.SqlCeProviderFactory, System.Data.SqlServerCe, Version=4.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" />
    </DbProviderFactories>
  </system.data>

并修改现有(默认) DefaultConnection 如下所示:

<add name="DefaultConnection" providerName="System.Data.SqlServerCe.4.0" connectionString="Data Source=|DataDirectory|aspnet-membership.sdf" />

在这些修改之后,我能够使用 Sql Server Compact 版本继续本教程。

山姆

于 2013-02-05T08:09:07.837 回答
0

如果您使用的是 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 包

有关更多详细信息,请查看此博客条目

于 2013-02-01T06:02:30.343 回答
0

我也遵循了该教程,并遇到了同样的问题。我删除了连接字符串,然后我能够添加控制器,它创建了其他文件。然后我再次将相同的连接字符串添加到 Web.config 文件中,将它准确地插入到之前的相同位置。它解决了我的问题。

于 2015-04-28T21:39:06.117 回答
0

我只是尝试了一下,发现了问题。

在本教程中,您将在 web.config 中添加以下行

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

似乎它有问题..我只是将其注释掉并使用了SqlServer,它对我有用。如果您仍想使用 SqlServerCe,您需要查看如何解决该问题。

于 2012-09-14T07:58:06.593 回答
0

我正在学习本教程: http: //mvcmusicstore.codeplex.com/。并得到同样的错误。我在 NuGet 包列表中找到了一个项目名称“EntityFramework.SqlServerCompact”,并安装它,一切正常!注意,包依赖的实体框架,你可以在这里查看所有版本:https ://www.nuget.org/packages/EntityFramework.SqlServerCompact 。祝你好运!

于 2015-08-09T02:40:42.097 回答
0

数据源路径错误,可以在“Movie.sdf”前加一个“\”。像这样:

<add name="MovieDBContext" connectionString="Data Source=|DataDirectory|\Movie.sdf" providerName="System.Data.SqlServerCe.4.0"/>
于 2017-04-25T08:05:35.223 回答
-1

我在另一个解决方案中遇到了同样的问题。它出现在我引入对基本构造函数的参数化调用之后,就像默认UsersContext类中包含的调用一样。

这失败了

public class MovieDBContext : DbContext
{
  public MovieDBContext() : base("DefaultConnection")
  {
  }

  ...
}

这有效

public class MovieDBContext : DbContext
{
  // No constructor here
  ...
}

似乎在构造函数中命名连接字符串会产生错误。我的 web.config 中只有一个连接字符串,所以DefaultConnection仍然使用,尽管我没有明确命名它。

于 2012-10-15T18:14:41.523 回答