我正在实体框架上学习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="Data Source=001\;Initial Catalog=**;Integrated Security=False;User ID=**;Password=**;MultipleActiveResultSets=True;Application Name=EntityFramework"" 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="data source=001\;Persist Security Info=True;User ID=**;password=**;multipleactiveresultsets=True;App=EntityFramework"" 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”连接字符串中,并设置为测试数据库,并且所有凭据都正确时,我会在发布时收到原始错误。如果我将初始目录更改为生产名称并保留错误的凭据以进行登录,则会出现登录失败错误。如果我更改凭据并将测试数据库保留在初始目录中,则相同。所以它似乎正确地进行了身份验证,但是一旦连接通过,其他东西就会成为一个因素吗?
答案 0 :(得分:0)
对于遇到这个问题的其他人。我终于弄明白了。另一个开发人员在所有存储过程中明确引用生产数据库。我取出所有引用并使用在导出/导入过程中隐式注入的“use”语句离开了隐式调用。
示例:
USE [TestDatabase]&lt; ----这是程序顶部的
这是对生产数据库的显式调用: FROM [productionDB]。[dbo]。[表]表
就像这样隐式调用: FROM [dbo]。[表]表
如果我的解决方案不适合你,我也偶然发现了sql server 2008中的这个错误: