0

在我的开发机器上,一切正常。即使使用生产连接值(即使我从开发机器连接到生产)。我不认为这是一个权限问题,因为我使用的是相同的凭据,只是使用 EF5 而不是 linq2sql,作为该服务的先前版本。此外,sql-profiler 不会显示失败的登录尝试。

连接字符串是:

数据源=MYSQLSERVER;数据库=MYDB;集成安全=True;

错误是:

键“attachdbfilename”的值无效。

我已经记录了传递到 dbContext 代码中的连接字符串:

Database.Connection.ConnectionString = settings.DbConnectionHourly;

这是一个继承自我的真实 dbContext(打包在 dll 中)的类,并且设置被注入。同样,这在开发中有效,但在生产中无效(服务器 2008 r2、IIS 7.5、framework.4)。

4

1 回答 1

0

事实证明,实体框架试图变得非常聪明,但它给出了一个非常不聪明的错误消息。因此,按照惯例,如果您不将上下文名称作为构造函数传入,实体框架将假定类名作为连接字符串的名称。它还将做什么(我不知道)正在开发中,它将使用 sqlExpress 中内置的 Visual Studio 自动连接并创建模式。因此,在开发过程中,一切正常,因为这种“自动”创建成功,并且由于我后来更改了与不同数据库的连接,所以我对 EF 在幕后所做的事情一无所知(EF 做错了事情,但最终结果奏效了)。

但是,当应用程序投入生产时,网络服务器上没有 sqlexpress 或任何数据库,因此自动连接/创建序列失败。现在,如果错误消息中有任何有用的信息,这将是显而易见的。但由于我从未设置过“attachdbfilename”,它也没有告诉我“attachdbfilename”的值是什么或任何上下文或它试图做什么,这使得弄清楚这一点更具挑战性。

修复很简单:

public HourlyContext(ISettingsWrapper settings)
        : base(settings.DbConnectionHourly)
    { }

而不是在创建上下文后设置连接(创建过程将立即尝试使用它内置的约定/默认值来发挥它的魔力),我现在通过构造函数立即设置它。

于 2013-10-08T20:21:43.250 回答