使用Entity Framework和SqlConnection?

时间:2014-09-23 15:54:46

标签: c# sql sql-server entity-framework

背景

我正在开发一个包含遗留代码和实体框架代码的项目。我被建议使用特定的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=&quot;data source=RemoteServer;initial catalog=FooDatabase;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" 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中的两个连接字符串中看到。

1 个答案:

答案 0 :(得分:1)

您是否可以从实体框架的新弹性中受益,它可以透明地重试?如果错误是间歇性的,你甚至不知道它会被重试,而ADO.net会让你知道它一旦失败就会失败。只是检查......