【问题标题】:Entity Framework Can't Find Connection String in Web.config实体框架在 Web.config 中找不到连接字符串
【发布时间】:2016-01-26 13:24:39
【问题描述】:

Entity Framework 似乎并未真正从 Web.config 读取连接字符串。

我开始了一个新项目并创建了一个上下文:

public class FooContext : DbContext
{
    public FooContext() :
        base("Foo")
    {
    }

    // DbSets here
}

然后,我在项目 Web.config 中添加了一个连接字符串:

<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <connectionStrings>
    <add name="Foo" providerName="System.Data.SqlClient" connectionString="Data Source=Foo;Initial Catalog=Foo;Integrated Security=False;User Id=foo;Password=foo;MultipleActiveResultSets=True" />
  </connectionStrings>
  <appSettings>
      ...

我启用了迁移,生成了初始迁移,然后尝试更新数据库。过了一会儿,更新失败,说它无法连接到数据库。所以我将我的项目 DLL 拉入 LINQPad 并运行以下命令:

var context = new FooContext();
context.Database.Connection.ConnectionString.Dump();

我得到以下输出:

Data Source=.\SQLEXPRESS;Initial Catalog=Foo;Integrated Security=True;MultipleActiveResultSets=True

它正在尝试连接到 LocalDB,完全忽略了我的连接字符串。所以我尝试在上下文构造函数中更加明确,通过使用"name=Foo" 而不仅仅是"Foo"

public FooContext() :
    base("name=Foo")
{
}

对于它的价值,我以前从来没有这样做过。我什至在同一个解决方案中有其他项目,我只是传递了连接字符串名称并且它们工作正常。

我跳回到 LINQPad 并再次运行代码,现在我得到了一个异常:

No connection string named 'Foo' could be found in the application config file.

我完全不知所措。我已经建立了 100 次这样的项目,从来没有遇到过任何问题。由于它可能很重要,我正在运行最新的实体框架 6.1.3。有什么想法可以在这里发生吗?

【问题讨论】:

  • 你确定这是它正在查看的配置文件,可能你有多个配置文件吗?
  • 不。项目根目录中只有一个 Web.config。
  • 我假设您在 Visual Studio 中运行它,请确保您将 Web 项目作为启动项目运行以使用 web.config。如果您正在运行另一个控制台或 .tests 项目作为启动,它将选择他们的 app.config 文件作为配置文件
  • 一个……就是这样。奇怪的是,在调用更新数据库时,我什至在包管理器控制台中将该项目指定为启动项目,但显然,我必须明确将其设置为解决方案的启动项目,然后它才能工作。如果您想发表评论作为答案,我会接受。谢谢。

标签: c# entity-framework


【解决方案1】:

我假设您在 Visual Studio 中运行它,请确保您将 Web 项目作为启动项目运行以使用 web.config。如果您正在运行另一个控制台或 .tests 项目作为启动,它将选择他们的 app.config 文件作为配置文件。

【讨论】:

    【解决方案2】:

    请记住,EntityFramework 在运行代码的程序集的配置中搜索连接字符串。例如,如果您通过单元测试运行程序使用测试方法执行您的 EF 方法,那么 EF 将在您的测试程序集中搜索它,而不是在存储 EF 方法的位置。我相信这可能是你的情况。

    顺便说一句 - 在 EntityFramework 5 中,创建 Edmx 时它会自动生成 DbContext,它使用 name=ConnectionString,而不仅仅是 ConnectionString,所以我认为还可以。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-13
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      相关资源
      最近更新 更多