首页 文章

SQL Anywhere,实体框架4和事务

提问于
浏览
0

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

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

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

有一种数据类型有数百万行 . 我们需要尽快加载这些数据 . 我正在使用 SABulkCopy 类实现导入该数据类型的逻辑 . 这也需要是已经开始的单个事务的一部分 . 问题是我需要将 SATransaction 传递给 SABulkCopy 类's constructor (there is no way to set it it using properties) and I don'来有一个 SATransaction . context.Connection.BeginTransaction() 返回 DBTransaction . 我试图把它投入 SATransaction 但没有成功 .

什么是让 SABulkCopy 对象加入交易的正确方法?

1 回答

  • 2

    我们放弃了 SABulkCopy 课程 . 事实证明,它不会进行批量加载 . 它创建一个 SACommand 对象,该对象执行 INSERT 语句并一次插入一行 . 它启动时效率低下 .

    我仍然需要得到与 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 ] );
    

    该计划完成了它需要做的事情 . 它's unfortunate, though, that Microsoft didn' t使 EntityTransaction 类的 StoreTransaction 属性公开 .

相关问题