connectionString默认为生产数据库..实体框架

时间:2015-05-22 20:20:21

标签: entity-framework asp.net-mvc-4 connection-string

我正在实体框架上学习asp.net mvc 4。我接手了一个项目,我正在尝试根据应用程序所处的环境(dev,test,prod)集中连接凭据。

目前我有连接字符串动态,但由于某种原因实体框架忽略连接字符串初始目录设置。

<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”

运行调试器会显示扩展ObjectContext的基类,如此所示,

:base(“name = name2”,“name2”)

我认为初始目录已经在连接字符串中设置了“name1”,并且会转移到name2 ..但是为了它,我将初始目录添加到第二个连接字符串,它仍然默认为错误的目录。我正在连接到同一个数据库服务器,但我们有一个测试和一个生产数据库..

什么可以覆盖此目录设置并重定向到错误的数据库?当我运行我的代码时,我得到了一个不足之处,告诉我用户名(测试数据库用户名)无法访问生产数据库,但我不确定为什么要传入生产数据库。

以下是例外:

服务器主体“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”连接字符串中,并设置为测试数据库,并且所有凭据都正确时,我会在发布时收到原始错误。如果我将初始目录更改为生产名称并保留错误的凭据以进行登录,则会出现登录失败错误。如果我更改凭据并将测试数据库保留在初始目录中,则相同。所以它似乎正确地进行了身份验证,但是一旦连接通过,其他东西就会成为一个因素吗?

1 个答案:

答案 0 :(得分:0)

对于遇到这个问题的其他人。我终于弄明白了。另一个开发人员在所有存储过程中明确引用生产数据库。我取出所有引用并使用在导出/导入过程中隐式注入的“use”语句离开了隐式调用。

示例:

USE [TestDatabase]&lt; ----这是程序顶部的

这是对生产数据库的显式调用: FROM [productionDB]。[dbo]。[表]表

就像这样隐式调用: FROM [dbo]。[表]表

如果我的解决方案不适合你,我也偶然发现了sql server 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