实体框架代码首先尝试打开错误的数据库
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 使用我的并且一切正常。
【讨论】:
以上是关于实体框架代码首先尝试打开错误的数据库的主要内容,如果未能解决你的问题,请参考以下文章
具有多个 MySql 模式的实体框架多个 DbContext