仅在生产中EF5连接字符串错误

时间:2013-10-04 02:23:06

标签: entity-framework

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

连接字符串是:

  

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

错误是:

  

键'attachdbfilename'的值无效。

我已记录传递给dbContext代码的连接字符串:

Database.Connection.ConnectionString = settings.DbConnectionHourly;

这是一个继承自我的真实dbContext(包装在dll中)的类,并且设置被注入。同样,这适用于Dev但不适用于生产(服务器2008 r2,IIS 7.5,framework.4)。

1 个答案:

答案 0 :(得分:0)

事实证明,实体框架试图变得非常聪明,但它提供了一个非常不智能的错误消息。因此,按照惯例,如果不将构造函数作为上下文名称传递,则实体框架将假定classname作为连接字符串的名称。它还将做什么(我不知道),在开发中它将使用sqlExpress中内置的visual studio自动连接并创建一个模式。所以在开发过程中,一切都行之有效,因为这个'自动'创建成功了,因为我后来改变了与不同数据库的连接,我对EF在幕后做的事情一无所知(EF做了错误的事情,但最终的结果是有效的)。

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

修复很简单:

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

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