0

我的程序中有一个使用 Entity Framework 4 EDM 的进程。实体上下文对象包含用于调用存储过程的函数导入。

该进程从远程服务器接收一批数据。批处理可以包含我们任何表/数据类型的数据(每种数据类型都存储在自己的表中)。该批次还可以多次包含同一行的数据。它必须将其作为单个插入(对于第一次出现)和一个或多个更新(对于每个后续出现)来处理。INSERT ... ON EXISTING UPDATE因此,存储过程使用该命令实现了 upsert 操作。

我们的代码基本上确定要调用哪个存储过程,然后使用该存储过程的实体上下文对象的方法调用它。然后整个批处理必须在单个事务中完成,因此我们context.Connection.BeginTransaction()在批处理开始时调用。

有一种数据类型有数百万行。我们需要尽快加载这些数据。我正在实现使用SABulkCopy该类导入该数据类型的逻辑。这也需要是已经开始的单个事务的一部分。问题是我需要将 an 传递SATransactionSABulkCopy类的构造函数(无法使用属性对其进行设置)并且我没有SATransaction. context.Connection.BeginTransaction()返回一个DBTransaction。我试图把它变成一个SATransaction没有成功的东西。

SABulkCopy对象加入事务的正确方法是什么?

4

1 回答 1

2

我们放弃了这SABulkCopy门课。事实证明,它不会进行批量加载。它创建一个SACommand执行INSERT语句并一次插入一行的对象。而且它的启动效率很低。

我仍然需要获取SATransactionDBTransaction返回的相关联的信息,context.Connection.BeginTransaction(). 我得到了一些反射代码,以响应我发布的另一个问题:

SATransaction saTransaction = (SATransaction) dbTransaction.GetType() 
                                                           .InvokeMember( "StoreTransaction", 
                                                                          BindingFlags.FlattenHierarchy | BindingFlags.NonPublic   | BindingFlags.InvokeMethod |
                                                                          BindingFlags.Instance         | BindingFlags.GetProperty | BindingFlags.NonPublic, 
                                                                          null, dbTransaction, new object[ 0 ] );

该程序做它需要做的事情。不幸的是,微软没有公开该类的StoreTransaction财产。EntityTransaction

于 2013-03-27T16:32:03.863 回答