可以向数据库发送批量插入,但不能更新查询



我可以成功地将批量插入请求发送到数据库,但不能发送更新。我尝试了不同的方法,但似乎没有任何内容可以发出批量更新。

我找不到这个问题的解决方案。我尝试过的一些例子(不是全部(:

  • NHIBERNATE:批量执行更新
  • NHibernate批量插入或更新
  • NHibernate批量插入不起作用

*重要。我不能使用无状态会话。

这是我用来测试这种情况的单元测试:

[Test]
public void Test_BatchUpdateTest()
{
// Arrange
const int batchSize = 2;
var dto1Oid = Guid.Empty;
var dto2Oid = Guid.Empty;
// Generates a transaction, executes the content, and commit it afterwards. 
// Batch inserts are correct, both are sent with no extra roundtrips to DB.
businessObject.Transact(() => {
var dto1 = new DtoType {ArchivingDate = DateTime.Now.AddDays(-7)};
var dto2 = new DtoType {ArchivingDate = DateTime.Now};
businessObject.Save(dto1); // Calls Session.SaveOrUpdate
businessObject.Save(dto2); // Calls Session.SaveOrUpdate
dto1Oid = dto1.Oid ?? Guid.Empty;
dto2Oid = dto2.Oid ?? Guid.Empty;
}, batchSize); // Calls Session.SetBatchSize(batchSize); before executing content above, sets it back to default after commit
// Act
businessObject.Transact(() =>
{
var dto1 = businessObject.LoadObject(dto1Oid);
var dto2 = businessObject.LoadObject(dto2Oid);
// Changing data to generate Update requests (should be sent in batches)
dto1.ArchivingDate = DateTime.Now.AddDays(7);
dto2.ArchivingDate = DateTime.Now.AddDays(1);
businessObject.Save(dto1);
businessObject.Save(dto2);
}, batchSize); // Calls Session.SetBatchSize(batchSize); before executing content above, sets it back to default after commit
// Assert
//<Check DB Requests on NHibernate Profiler> // On NHProfiler, the inserts are sent in a single request as seen in "Insert request"
}

插入请求(批处理正确发送(:

INSERT INTO DtoType
(... Fields)
VALUES      (... Values)
--//////////////////////////////////////////////////
INSERT INTO DtoType
(... Fields)
VALUES      (... Values)

更新请求1(第一次更新,应与下面的请求 2 一起批量(:

UPDATE DtoType
SET    ArchivingDate = '<updated date>'
WHERE  Id = '<dto1 id>'

更新请求2(第二次更新,应与上面的请求 1 分批(:

UPDATE DtoType
SET    ArchivingDate = '<updated date>'
WHERE  Id = '<dto2 id>'

我的目标是为两个更新只发送 1 个请求,就像在插入请求中一样。

问题是我使用的是 NHibernate v4,而数据结构DtoType使用版本控制。NH v4 不支持批量更新版本化结构。在 v5 中添加了支持(链接在这里( 使用 v5 并添加 nhibernate 设置adonet.batch_versioned_data=true解决了我的问题。我现在可以向数据库发送批量更新请求。

最新更新