Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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# 在托管代码和非托管代码之间共享数据库事务_C#_C++_Visual Studio 2008_Oracle_Entity Framework - Fatal编程技术网

C# 在托管代码和非托管代码之间共享数据库事务

C# 在托管代码和非托管代码之间共享数据库事务,c#,c++,visual-studio-2008,oracle,entity-framework,C#,C++,Visual Studio 2008,Oracle,Entity Framework,我有.net3.5c#应用程序 应用程序使用EntityFramework作为其数据库接口 此应用程序调用C++ +非托管DLL,也使用DB。此dll更新数据库 我希望能够回滚。我希望此操作包括主应用程序所做的更改和dll所做的更改 我怎样才能做到?我可以与dll共享同一个db连接吗?我可以与dll共享事务吗 谢谢 Mattan通过实体框架,您可以提供自己的SqlConnection实例。然后,您可以使用此实例启动与的事务。这使您可以控制数据库连接,这是一个开始 关于非托管代码,我建议您允许从D

我有.net3.5c#应用程序

应用程序使用EntityFramework作为其数据库接口

此应用程序调用C++ +非托管DLL,也使用DB。此dll更新数据库

我希望能够回滚。我希望此操作包括主应用程序所做的更改和dll所做的更改

我怎样才能做到?我可以与dll共享同一个db连接吗?我可以与dll共享事务吗

谢谢


Mattan

通过实体框架,您可以提供自己的
SqlConnection
实例。然后,您可以使用此实例启动与的事务。这使您可以控制数据库连接,这是一个开始

关于非托管代码,我建议您允许从DLL向托管代码中输入一个入口点,允许它在此
SqlConnection
上执行SQL


由于
SqlConnection
类完全是在托管代码中编写的,因此不可能将实际的连接句柄传递给非托管代码并允许正常的非托管函数使用此连接。因为您有实体框架作为起点,您将需要
SqlConnection
,因此让DLL向托管连接发送SQL语句可能是唯一的方法。

使用实体框架,您可以提供自己的
SqlConnection
实例。然后,您可以使用此实例启动与的事务。这使您可以控制数据库连接,这是一个开始

关于非托管代码,我建议您允许从DLL向托管代码中输入一个入口点,允许它在此
SqlConnection
上执行SQL


由于
SqlConnection
类完全是在托管代码中编写的,因此不可能将实际的连接句柄传递给非托管代码并允许正常的非托管函数使用此连接。因为您有实体框架作为起点,所以需要
SqlConnection
,所以让DLL向托管连接发送SQL语句可能是唯一的方法。

您确定没有办法共享DB连接吗?是的。问题在于,托管连接不仅仅是包装一个非托管MSSQL连接库:它是一个完全托管的实现。这意味着不存在要获取的“原始非托管句柄”。这意味着您正在使用两个完全分离的实现:托管和非托管。因此,您必须选择一个并通过该连接路由所有命令。由于我无法想象实体框架与非托管版本的包装器一起工作,因此我会尝试采用答案中所述的另一种方式。您确定没有办法共享DB连接吗?是的。问题在于,托管连接不仅仅是包装一个非托管MSSQL连接库:它是一个完全托管的实现。这意味着不存在要获取的“原始非托管句柄”。这意味着您正在使用两个完全分离的实现:托管和非托管。因此,您必须选择一个并通过该连接路由所有命令。由于我无法想象实体框架与非托管版本的包装器一起工作,因此我会尝试按照答案中所述的另一种方式。