RavenDB OnBeforeStore不使用BulkInsert触发

问题描述

我无法使用BulkInsert触发OnBeforeStore。

在常规存储操作中会正常发射。

我正在尝试使用发票编号生成器来添加格式化的编号,我想在OnBeforeStore中这样做。

请参见代码示例:

static async Task GenerateInvoiceTest()
{
    using var store = new DocumentStore
    {
        Urls = new string[] { "https://localhost:8080" },Database = "APC",};

    //this never fires using BulkInsert
    store.OnBeforeStore += (s,e) =>
    {
        if (!(e.Entity is Invoice invoice)) return;
        if (invoice.InvoiceNumber != 0) return;
        invoice.InvoiceNumber = new Random().Next(1,1000);
    };

    store.Initialize();

    //sample invoices
    var invoices = new List<Invoice>
    {
        new Invoice { StartDate = DateTime.Now,EndDate = DateTime.Now.AddDays(3) },new Invoice { StartDate = DateTime.Now,};

    //bulk insert test
    using var session = store.OpenAsyncSession();
    using var bulkInsert = store.BulkInsert();
    invoices.ForEach(i => bulkInsert.Store(i));            
    
    //this does NOT fire OnBeforeStore
    await session.SaveChangesAsync();
    
    foreach (var invoice in invoices)
    {
        //always prints 0
        Console.WriteLine(invoice.InvoiceNumber);
    }

    //regular test
    var otherInvoice = new Invoice { StartDate = DateTime.Now,EndDate = DateTime.Now.AddDays(3) };

    await session.StoreAsync(otherInvoice);

    //this DOES fire OnBeforeStore
    await session.SaveChangesAsync();
}

解决方法

OnBeforeStore作为 Session SaveChanges方法的一部分被调用

有关 OnBeforeStore 的信息,请参阅此文档
http://localhost:54391/docs/article-page/5.0/Csharp/client-api/session/how-to/subscribe-to-events

该事件采用参数BeforeStoreEventArgs,该参数由 Session 实体的ID和实体本身组成。

您在“ 商店”上定义了OnBeforeStore,但不适用于bulkInsert。
用于从会话保存。
BulkInsert在商店本身而非会话上进行操作

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...