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

Can send batch insert but not update queries to DB

我可以成功向数据库发送批量插入请求,但不能发送更新。我尝试了不同的方法,但似乎没有任何问题可以发布批量更新。

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

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

这是我用来测试这个案例的单元测试:

[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.The v5 中添加了支持 (link here) 使用 v5 并添加 nhibernate 设置 adonet.batch_versioned_data=true 解决了我的问题。我现在可以向数据库发送批量更新请求。