C# 同时使用实体框架和SqlConnection? 背景

C# 同时使用实体框架和SqlConnection? 背景,c#,sql,sql-server,entity-framework,C#,Sql,Sql Server,Entity Framework,我正在从事一个包含遗留代码和实体框架代码的项目。有人建议我使用特定的dataservice方法对数据库中的记录进行操作。记录是通过实体框架检索的,我将PK传递到dataservice函数来执行操作 成功与失败的先决条件 如果网络已启动,则两个DB调用(实体和SQL)都将成功如果网络宕机,然后返回并执行此代码,则它将使用entity framework检索锁定的记录,但随后由于下面的SqlException而失败 这让我想到,尽管EF能够建立连接,但这里发生的事情可能会导致SqlConnectio

我正在从事一个包含遗留代码和实体框架代码的项目。有人建议我使用特定的dataservice方法对数据库中的记录进行操作。记录是通过实体框架检索的,我将PK传递到dataservice函数来执行操作

成功与失败的先决条件 如果网络已启动,则两个DB调用(实体和SQL)都将成功如果网络宕机,然后返回并执行此代码,则它将使用entity framework检索锁定的记录,但随后由于下面的
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);
            }
        }
    }
    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();
            }
        }
    }
SqlConnectionDataService.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);
            }
        }
    }
    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" />

现在,在与同事讨论之后,我最终将逻辑转移到实体框架数据服务中,并在那里进行工作。但我仍然不太清楚为什么连接一直失败

编辑:实际错误为:

System.Data.dll中发生“System.Data.SqlClient.SqlException”类型的异常,但未在用户代码中处理

其他信息:建立与SQL Server的连接时发生网络相关或特定于实例的错误。找不到服务器或无法访问服务器。验证实例名称是否正确,以及SQL Server是否配置为允许远程连接。(提供程序:命名管道提供程序,错误:40-无法打开到SQL Server的连接)

内部异常:

找不到网络路径


但是Entity Framework使用的是相同的网络路径,这可以从App.config中的两个连接字符串中看出。

Entity Framework的新弹性(它可以透明地重试)是否能让您受益?如果错误是间歇性的,您甚至不知道它是否重试过,而ADO.net让您知道它一失败就失败了。正在检查…

异常的实际消息文本是什么?是否存在内部异常?似乎无法访问服务器,您确定使用的连接字符串是否正常?异常基本上是指无法使用您提供的连接字符串连接到sql server。如果您间歇性地得到该消息,则表明存在网络问题,而不是代码中的任何内容。如果你得到的是一致的,那么你使用的连接字符串是错误的。对别人大喊大叫不会帮助你得到答案。不必难过:-)如果我没记错的话,EF使用的是特殊的连接字符串,对于“常规”数据连接可能无法正常工作。向我们展示你的连接字符串(当然要屏蔽敏感信息)。我倾向于相信这一点,因为我知道实体框架做了某种形式的自定义连接管理。您是否可以提供任何链接,以提供发生这种情况的证据?我唯一关心的是,sql查询只有在实体框架查询成功时才会发生,这意味着连接必须可用。您为多个活动结果集设置了什么值?否,只有当您显式配置EF时,它才具有连接弹性。@对于EF,reckface MARS设置为true