我使用RavenDB 1.0.0.426
将数据从外部源导入RavenDB时,我遇到了一个奇怪的情况:
我选择使用与外部源使用相同的唯一ID,前缀为某个字符串。但。当我存储ID为以“/”结尾的文档时,raven会自动在ID的末尾添加一个数字,导致文档不会覆盖以相同ID存储的现有文档。
我重新创建了一个简单的场景来导致错误:
我保存的类型:
public class Foo
{
public string Id { get; set; }
public Foo(string id)
{
Id = id;
}
}
方法将具有相同ID的文档保存10次,然后检查文档计数:
public void RunTest(string id)
{
for (int i = 0; i < 10; i++)
{
using (var doc = new DocumentStore() { Url = "http://pc-009:8080/" })
{
doc.Initialize();
using (var session = doc.OpenSession())
{
session.Store(new Foo(id));
session.SaveChanges();
}
}
}
// Wait for the data to be persisted
Thread.Sleep(2000);
using (var doc = new DocumentStore() { Url = "http://pc-009:8080/" })
{
doc.Initialize();
using (var session = doc.OpenSession())
{
var foos = session.Query<Foo>();
int fooCount = foos.Count();
// ASSERT HERE THAT fooCount is 1
}
}
}
使用“id1”运行方法会成功覆盖现有文档:
RunTest("id1"); // Works fine
使用“id1 /”的运行方法最终会在数据库中创建10个文档:
RunTest("id1/"); // Results in multiple documents to be created
我知道如果你没有定义自己的ID,raven会动态自动生成doc-id,但这是我在设计中描述的行为吗?
提前谢谢
答案 0 :(得分:5)
斯蒂芬, 这是预期的,当你的密钥以/结尾时,它要求ravendb使用身份生成策略。 请参阅此处的文档: http://ravendb.net/documentation/docs-api-key-generation
如果你想要一个以/结尾的密钥,你可以对密钥进行url编码