我正在使用RavenDB 4.0.6的BulkInsert操作插入一堆产品:
using (var bulk = Store.BulkInsert())
{
foreach (var p in products)
{
p.Id = string.Empty; // <-- notice this
await bulk.StoreAsync(p);
}
}
请注意,我通过显式提供string.Empty
作为Id属性的值来故意跳过标识符创建策略。这基于RavenDB文档section Autogenerated ID's。
运行代码时出现错误:
System.InvalidOperationException:文档ID必须具有非空值
此代码段直接在BulkInsertOperation.cs中产生。
我的问题是如何防止该错误,并且仍然保持与其他代码相同的ID生成策略?
例如我从未将Id属性设置为string.Empty
以外的任何其他值。而且我担心将其设置为例如Guid.NewGuid.ToString()
可能会导致其他问题(也请参见this question)。
答案 0 :(得分:2)
对于批量操作,您必须将Id属性保留为null(非空字符串)以使其自动生成顺序ID,或者手动生成Guid ID。
批量插入和会话插入之间的API有点不一致:
using (var store = new DocumentStore() { Urls = new[] { "http://localhost:8080" } }.Initialize())
{
using (var bulk = store.BulkInsert("Sample"))
{
bulk.Store(new SampleDocument { Name = "Bulk.Store Null Id", Id = null }); // Sequential Id (I.E. SampleDocuments/1-A)
bulk.Store(new SampleDocument { Name = "Bulk.Store Blank Id", Id = "" }); // Throws Error
bulk.Store(new SampleDocument { Name = "Bulk.Store Guid Id", Id = Guid.NewGuid().ToString() }); // Guid Id
}
using (var session = store.OpenSession("Sample"))
{
session.Store(new SampleDocument { Name = "Session.Store Null Id", Id = null }); // Sequential Id (I.E. SampleDocuments/2-A)
session.Store(new SampleDocument { Name = "Session.Store Empty Id", Id = "" }); // Guid Id
session.Store(new SampleDocument { Name = "Session.Store Guid Id", Id = Guid.NewGuid().ToString() }); // Guid Id
session.SaveChanges();
}
}