RavenDB在以斜杠结束时向ID添加整数

RavenDB在以斜杠结束时向ID添加整数,ravendb,Ravendb,我使用Ravendb1.0.0.426 我刚刚在将数据从外部源导入RavenDB时遇到了一个奇怪的场景: 我选择使用与外部源使用的相同的唯一ID,前缀为某个字符串。但是当我存储一个ID以“/”结尾的文档时,raven会自动在该ID的末尾添加一个数字,从而使该文档不会覆盖以相同ID存储的现有文档 我已重新创建了一个导致错误的简单场景: 我保存的类型: public class Foo { public string Id { get; set; } public Foo(strin

我使用Ravendb1.0.0.426

我刚刚在将数据从外部源导入RavenDB时遇到了一个奇怪的场景:

我选择使用与外部源使用的相同的唯一ID,前缀为某个字符串。但是当我存储一个ID以“/”结尾的文档时,raven会自动在该ID的末尾添加一个数字,从而使该文档不会覆盖以相同ID存储的现有文档

我已重新创建了一个导致错误的简单场景:

我保存的类型:

public class Foo
{
    public string Id { get; set; }
    public Foo(string id)
    {
        Id = id;
    }
}
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
        }
    }
}
RunTest("id1"); // Works fine
RunTest("id1/"); // Results in multiple documents to be created
方法将具有相同id的文档保存10次,然后检查文档计数:

public class Foo
{
    public string Id { get; set; }
    public Foo(string id)
    {
        Id = id;
    }
}
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
        }
    }
}
RunTest("id1"); // Works fine
RunTest("id1/"); // Results in multiple documents to be created
使用“id1/”运行方法,最终在数据库中创建10个文档:

public class Foo
{
    public string Id { get; set; }
    public Foo(string id)
    {
        Id = id;
    }
}
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
        }
    }
}
RunTest("id1"); // Works fine
RunTest("id1/"); // Results in multiple documents to be created
我知道,如果您不定义自己的ID,raven将动态自动生成文档ID,但我上面描述的行为是设计的吗

提前谢谢你

斯蒂芬, 这是预期的,当您的密钥以/结尾时,它会要求ravendb使用身份生成策略。 请参见此处的文档:


如果您想要以/结尾的密钥,可以对密钥进行url编码,再次感谢。我猜/是这件事中唯一保留的角色?