我正在开发一个包含遗留代码和实体框架代码的项目。我被建议使用特定的dataservice方法来操作数据库中的记录。记录是通过Entity Framework检索的,我将PK传递给dataservice函数来执行操作。
如果网络已启动,则两个数据库调用(实体和SQL)都将成功。 如果网络出现故障,则会重新启动并执行此代码,然后它会使用实体框架检索锁定的记录,但随后会失败并显示下面的SqlException
。
这让我想到,尽管EF能够建立连接,但这里发生的事情可能导致SqlConnection
失败。
代码示例如下:
public void HandleNetworkBecomesAvailable() {
_entityFrameworkDataService.ReleaseRecords();
}
EntityFrameworkDataService.cs
public void ReleaseRecords()
{
using (var context = new Entities()) // using EntityConnection
{
var records = context.Records.Where(
record => record.IsLocked).ToList();
foreach (var record in records)
{
_sqlConnectionDataService.UnlockRecord(record.ID);
}
}
}
SqlConnectionDataService.cs
public void UnlockRecord(int recordId)
{
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["Sqlconnection"].ConnectionString))
{
connection.Open();
using (var command = connection.CreateCommand())
{
command.CommandText = @"UPDATE [Records] SET [IsLocked] = 0";
//etc
command.ExecuteNonQuery();
}
}
}
的App.config
<add name="EntityConnection" connectionString="metadata=res://*/FooDatabase.csdl|res://*/FooDatabase.ssdl|res://*/FooDatabase.msl;provider=System.Data.SqlClient;provider connection string="data source=RemoteServer;initial catalog=FooDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" providerName="System.Data.EntityClient" />
<add name="SqlConnection" connectionString="Server=RemoteServer;Database=FooDatabase;Trusted_Connection=True" />
现在,在与同事讨论之后,我最终将逻辑移动到实体框架数据服务中并在那里完成工作。但我仍然不太清楚为什么连接会失败。
编辑:实际错误是:
类型&#39; System.Data.SqlClient.SqlException&#39;的异常发生在System.Data.dll中但未在用户代码中处理
其他信息:建立与SQL Server的连接时发生与网络相关或特定于实例的错误。服务器未找到或无法访问。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。 (提供者:命名管道提供程序,错误:40 - 无法打开与SQL Server的连接)
内部例外:
找不到网络路径
但实体框架使用相同的网络路径,可以在App.config中的两个连接字符串中看到。
答案 0 :(得分:1)
您是否可以从实体框架的新弹性中受益,它可以透明地重试?如果错误是间歇性的,你甚至不知道它会被重试,而ADO.net会让你知道它一旦失败就会失败。只是检查......