我的程序中有一个使用Entity Framework4EDM的进程。实体上下文对象包含用于调用存储过程的函数导入。
该过程从远程服务器接收一批数据。批处理可以由我们的任何表/数据类型的数据组成(每种数据类型都存储在它自己的表中)。批处理还可以多次包含同一行的数据。它必须将此作为单个插入(对于第一次出现)和一个或多个更新(对于每次后续出现)进行处理。因此,存储过程使用INSERT ... ON EXISTING UPDATE命令实现upsert操作。
我们的代码基本上确定要调用哪个存储过程,然后使用该存储过程的实体上下文对象的方法来调用它。然后整个批处理必须在单个事务中完成,因此我们在批处理开始时调用context.Connection.BeginTransaction()。
有一种数据类型有数百万行。我们需要尽可能快地加载数据。我正在实现使用SABulkCopy类导入该数据类型的逻辑。这也需要是已经启动的单个事务的一部分。问题是我需要将一个SATransaction传递给SABulkCopy类的构造函数(没有办法使用属性来设置它),而我没有SATransaction。context.Connection.BeginTransaction()返回一个DBTransaction。我试图将其转换为SATransaction,但没有成功。
让SABulkCopy对象加入事务的正确方法是什么?
发布于 2013-03-28 00:32:04
我们放弃了SABulkCopy类。事实证明,它不执行批量加载。它创建一个执行INSERT语句的SACommand对象,并一次插入一行。而且它的启动效率很低。
我仍然需要获取与context.Connection.BeginTransaction().返回的DBTransaction相关联的SATransaction,在回答我发布的另一个关于这方面的问题时,我得到了一些这样做的反射代码:
SATransaction saTransaction = (SATransaction) dbTransaction.GetType()
.InvokeMember( "StoreTransaction",
BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.InvokeMethod |
BindingFlags.Instance | BindingFlags.GetProperty | BindingFlags.NonPublic,
null, dbTransaction, new object[ 0 ] );程序做它需要做的事情。不幸的是,微软没有公开EntityTransaction类的StoreTransaction属性。
https://stackoverflow.com/questions/12324175
复制相似问题