问题描述
我无法使用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在商店本身而非会话上进行操作