当以斜杠结尾时,RavenDB将整数添加到ID

时间:2011-08-16 18:07:14

标签: ravendb

我使用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,但这是我在设计中描述的行为吗?

提前谢谢

1 个答案:

答案 0 :(得分:5)

斯蒂芬, 这是预期的,当你的密钥以/结尾时,它要求ravendb使用身份生成策略。 请参阅此处的文档: http://ravendb.net/documentation/docs-api-key-generation

如果你想要一个以/结尾的密钥,你可以对密钥进行url编码