connectionString 默认为生产数据库.. Entity Framework

connectionString defaulting to production database.. Entity Framework

我正在学习 asp.net 在 entity framework 之上的 mvc 4。我接手了一个正在工作的项目,我正在尝试根据应用程序所在的环境(开发、测试、生产)集中连接凭据。

目前我有动态连接字符串,但出于某种原因 entity framework 忽略了连接字符串初始目录设置。

<connectionStrings>
 <add name="name1" connectionString="metadata=res://*/Model.csdl|res:  //*/Model.ssdl|res://*/Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=001\;Initial Catalog=**;Integrated Security=False;User ID=**;Password=**;MultipleActiveResultSets=True;Application Name=EntityFramework&quot;" providerName="System.Data.EntityClient" />

<add name="name2" connectionString="metadata=res://*/Entites.csdl|res://*/Entites.ssdl|res://*/Entites.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=001\;Persist Security Info=True;User ID=**;password=**;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

我不知道 connectionString 中一半的内容是什么意思,但它是第二个连接字符串给我带来麻烦,"name2"

运行 调试器显示基础 class,它扩展了像这样调用的 ObjectContext,

: 基础("name=name2", "name2")

我想 Initial Catalog 已经在连接字符串中设置了,"name1" 并且这将传输到 name2.. 但为了它,我将 Initial Catalog 添加到第二个连接字符串并且它仍然是默认值到错误的目录。我正在连接到同一个数据库服务器,但我们有一个测试数据库和一个生产数据库。

什么可能会覆盖此目录设置并重定向到错误的数据库?当我 运行 我的代码时,我得到一个内部异常,告诉我用户名(测试数据库用户名)没有访问生产数据库的权限,但我不确定为什么要传入生产数据库。

例外情况:

服务器主体 "testuser" 在当前安全上下文下无法访问数据库“ProductionName”。]

正在初始化 ObjectContext

    public Entities() : base("name=name2", "name2")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }

这也在 web.config 文件中:

<entityFramework>
   <defaultConnectionFactory   type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
   <providers>
     <provider invariantName="System.Data.SqlClient"  type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
   </providers>
</entityFramework>

我注意到其他有趣的事情。当我将初始目录设置保留在 "name2" 连接字符串中,并设置为测试数据库,并且所有凭据都正确时,我收到了发布时的原始错误。如果我将初始目录更改为产品名称并留下错误的登录凭据,我会收到登录失败错误。如果我更改凭据并将测试数据库保留在初始目录中,则相同。所以它似乎正确地进行了身份验证,但是一旦连接通过,还有其他因素吗?

对于遇到此问题的任何其他人。我终于弄明白了。另一个开发人员在所有存储过程中明确引用了生产数据库。我取出所有引用并使用在 export/import 过程中隐式注入的 "use" 语句保留隐式调用..

示例:

USE [TestDatabase] <---- 这在过程的顶部

这是对生产数据库的显式调用: 来自 [productionDB].[dbo].[Table] table

只需将其设为隐式调用,如下所示: 来自 [dbo].[Table] table

如果我的解决方案不适合您,我也在 sql 服务器 2008 中偶然发现了这个错误:

https://connect.microsoft.com/SQLServer/feedback/details/354291/the-server-principal-is-not-able-to-access-the-database-under-the-current-security-context-microsoft-sql-server-error-916