RavenDB OnBeforeStore 不会使用 BulkInsert 触发

RavenDB OnBeforeStore does not fire using BulkInsert

我无法使用 BulkInsert 触发 OnBeforeStore。

在正常的 Store 操作中它可以很好地触发。

我正在尝试使用发票编号生成器来添加格式化的编号,我想在 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, EndDate = DateTime.Now.AddDays(3) },
    };

    //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 和实体本身组成。

您在“Store”上定义了 OnBeforeStore,但它不适用于 bulkInsert。
它用于从 Session.
保存时 BulkInsert 在 Store 本身上操作,而不是在 Session