Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架6数据库优先-如何与ADO共享连接和事务_C#_Database_Entity Framework_Transactionscope_Entityconnection - Fatal编程技术网

C# 实体框架6数据库优先-如何与ADO共享连接和事务

C# 实体框架6数据库优先-如何与ADO共享连接和事务,c#,database,entity-framework,transactionscope,entityconnection,C#,Database,Entity Framework,Transactionscope,Entityconnection,在EF6 DB First方法中进行的操作和一些ADO操作之间是否可以共享一个连接(以及事务) 正如我在这里读到的: 自EFV6以来,可以共享连接和事务,但我必须将SqlConnection对象作为参数传递给上下文类的构造函数。 但如果我在DB-First方法中这样做,我会遇到意外的CodeFirstException 正如我在这里读到的: 当使用DB First方法时,我必须使用EntityConnection实例作为上下文类构造函数的参数。但是EntityConnection类构造函数只接受

在EF6 DB First方法中进行的操作和一些ADO操作之间是否可以共享一个连接(以及事务)

正如我在这里读到的: 自EFV6以来,可以共享连接和事务,但我必须将SqlConnection对象作为参数传递给上下文类的构造函数。 但如果我在DB-First方法中这样做,我会遇到意外的CodeFirstException

正如我在这里读到的: 当使用DB First方法时,我必须使用EntityConnection实例作为上下文类构造函数的参数。但是EntityConnection类构造函数只接受关闭的连接。 所以我不能共享事务,因为在传递到上下文类之前必须关闭连接

我说的对吗?在这种情况下不可能共享一个连接,或者可能有其他方式


TransactionScope仍然是将EF 6 DB中的操作首先包装到事务中并将ADO包装到事务中(使用单独的连接)的唯一方法吗?

我不记得这是从哪里得到的,但它帮助我在同一事务中运行
EF
SqlBulkCopy
。下面是如何从
实体框架
获取具有反射的事务:

EntityConnection ec = (EntityConnection)Context.Connection;
SqlConnection sc = (SqlConnection)ec.StoreConnection;
SqlTransaction sqlTransaction = null;

var parserProp = sc.GetType().GetProperty("Parser", BindingFlags.NonPublic | BindingFlags.Instance);

if (parserProp != null)
{
    var parser = parserProp.GetValue(sc, null);
    var sqltxProp = parser.GetType().GetProperty("CurrentTransaction", BindingFlags.NonPublic | BindingFlags.Instance);
    var currentTransaction = sqltxProp.GetValue(parser, null);
    sqlTransaction = currentTransaction as SqlTransaction;

    if (sqlTransaction == null)
    {
        var parentProp = currentTransaction.GetType().GetProperty("Parent", BindingFlags.NonPublic | BindingFlags.Instance);
        currentTransaction = parentProp.GetValue(currentTransaction, null);
        sqlTransaction = currentTransaction as SqlTransaction;
    }
}

您能详细说明一下为什么要共享连接吗?@RobTillie在我使用的应用程序中,部分代码仍然使用ADO,另一部分使用EF。我想将EF和ADO中的操作包装到事务中。TransactionScope有一些限制,MS建议使用一种连接方法。连接越少越好。你可以用反射来解决这个问题。我已经用ef和sqlbulkcopy完成了这项工作。目前无法复制代码。我猜您正在通过ado.net运行存储过程?您可以通过上下文运行存储过程。另一方面,我发现在相同的应用程序中同时运行ado.net和ef时,在调试可能的数据库问题时使用单独的连接字符串是值得的,因为您可以看到连接字符串问题是由哪些问题引起的。我不知道答案,只知道关于这个话题的几分钱。