实体框架代码首先尝试打开错误的数据库

Posted

技术标签:

【中文标题】实体框架代码首先尝试打开错误的数据库【英文标题】:Entity Framework code first tries to open wrong database 【发布时间】:2012-01-26 21:47:22 【问题描述】:

我正在编写一个 ASP MVC 3 应用程序。我正在为我的数据库使用 Sql Server 2008 R2。

我创建了我的数据模型,我的DbContext 称为EFDbContext。 我创建了名为 SportsStore 的数据库。

我的连接字符串是:

<add name="EFDbContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=SportsStore;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient" />

我运行应用程序,但没有显示任何数据。

我发现 EF 会自动生成一个新数据库 SportsStore.Domain.Concrete.EFDbContext,但我希望它使用我之前创建的 SportsStore,并将我的模型属性自动映射到表列。 如果我禁用自动生成数据库功能,我会收到以下错误:

无法打开数据库“SportsStore.Domain.Concrete.EFDbContext” 登录请求

实体框架不应该尝试打开 SportsStore 数据库吗?为什么它试图打开那个?我的连接字符串有误吗?

【问题讨论】:

EFDbContext 类的构造函数是什么样的?您是否将连接字符串传递给它?您可以将连接字符串传递给 DBContext 构造函数,或者在 web.config 文件中使用上下文类的名称设置连接字符串。 blogs.msdn.com/b/adonet/archive/2011/01/27/… 【参考方案1】:

奇怪...你有没有为你的连接字符串尝试过这个?我认为您需要 MARS 来使用 DbContext 做一些事情。

<add name="EFDbContext" connectionString="Data Source=LOCALHOST\SQLEXPRESS;Initial Catalog=SportsStore;Integrated Security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />

这些是唯一与我的一个项目不同的地方。您确定类和连接字符串的名称完全相同吗?你试过这样命名连接字符串吗?

<add name="SportsStore.Domain.Concrete.EFDbContext" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=SportsStore;Integrated Security=True;Pooling=False" providerName="System.Data.SqlClient" />

【讨论】:

好的,我回家后试试。我忘了说我的模型在另一个项目中,所以它在一个单独的 dll 中。我认为从 domain.dll 工作的实体框架甚至没有读取我的 mvc 应用程序中的 web.config 文件。也许我需要为 domain.dll 创建一个 app.config 并在那里设置我的连接字符串。【参考方案2】:

我只能给你一个建议。 当我在一个项目(通常是类库)中拥有我的 DbContext 和相应的连接字符串时,我遇到了类似的困难。但是,如果您在其他项目(如 win 表单)中使用它,它会忽略后者。它尝试从启动项目的配置文件中获取连接字符串。

如果是这种情况,请尝试将连接字符串放在启动项目配置文件中。

【讨论】:

我有一个 mvc 应用程序,这是我的启动项目,以及我的模型所在的 domain.dll。连接字符串位于 mvc 应用程序的 web.config 中。我认为它没有被读取,因此 EF 创建了一个与我的上下文名称相同的新数据库。我会尝试在 app.config 中为 domain.dll 设置我的连接字符串,看看会发生什么。 我遇到了同样的问题。配置需要在启动项目中。【参考方案3】:

hmm。我遇到了同样的错误。经过一番努力,我意识到我将连接字符串放在了错误的 Web.config 文件中。有两个 Web 配置文件。一个在视图文件夹下,另一个在项目下。你需要添加项目文件夹下的一个连接字符串

【讨论】:

【参考方案4】:

我已经注释掉了默认连接字符串并将我的放在下面:

<connectionStrings>
<!--<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=aspnet-MvcMovie-20130509163734;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnet-Mvc4Movie-20130509163734.mdf" providerName="System.Data.SqlClient" />-->
<add name="MoveieDBContext" ...

这使得 EF 忽略我的连接字符串并生成它自己的。取消注释默认连接使 EF 使用我的并且一切正常。

【讨论】:

以上是关于实体框架代码首先尝试打开错误的数据库的主要内容,如果未能解决你的问题,请参考以下文章

尝试添加项目时在实体框架中出现错误

实体框架代码首先进行连接状态检查

实体框架 6 代码优先到 RDS 尝试创建数据库

具有多个 MySql 模式的实体框架多个 DbContext

如何使用实体框架打开受密码保护的 SQL Server CE 数据库

实体框架数据模型的数据源错误