【问题标题】:RavenDB OnBeforeStore does not fire using BulkInsertRavenDB OnBeforeStore 不使用 BulkInsert 触发
【发布时间】:2020-10-23 01:30:19
【问题描述】:

我无法使用 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();
}

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    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 上运行

    【讨论】:

    • 谢谢。我想我会跳过 BulkInsert 进行此操作并循环调用 Store()
    • 我希望 BulkInsert 上有一个 BeforeStore 事件,因为这破坏了我对 RavenDB 的一些预期用途。现在,我们将简单地避免 BulkInsert,但不得不不使用如此有用的东西有点悲剧。 @Ayenda-Rahien
    猜你喜欢
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多