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="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"
运行 调试器显示基础 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 中偶然发现了这个错误:
我正在学习 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="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"
运行 调试器显示基础 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 中偶然发现了这个错误: