Guid 作为 RavenDB 中的 Id

2024-01-06

The RavenDb 文档 http://ravendb.net/docs/client-api/basic-operations/saving-new-document状态:

支持数字或 Guid Id 属性,并且可以无缝工作。在这种情况下,RavenDB 将自动在内部字符串 ID 与实体中显示的数字或 Guid 值之间进行转换。

我存储了以下对象:

class A
{
    public Guid Id { get; set; }
    public Guid BId { get; set; }
}

class B
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

然后我创建了以下投影:

class AB
{
    public Guid Id { get; set; }       // This should be the Id of A
    public Guid BId { get; set; }      // This should be the Id of B
    public string BName { get; set; }  // This should be the name of B
}

我创建了以下索引来创建投影:

class MyIndex : AbstractIndexCreationTask<AB>
{
    public MyIndex()
    {
        Map = docs =>
            from d in docs
            select new
            {
                d.Id,
                d.BId,
                BName = string.Empty
            };

        TransformResults = (database, results) =>
            from r in results
            let b = database.Load<B>("bs/" + r.BId.ToString())
            select new
            {
                r.Id,
                r.BId,
                BName = b.Name
            };
    }
}

当我使用以下查询时:

session.Query<AB, MyIndex>().FirstOrDefault(t => t.Id == guid);

我得到这个异常:

将值“bs/cc0a65ae-dd36-4437-8a57-fa20b91eeef7”转换为类型“System.Guid”时出错。路径“Id”。

问题:

  1. 这是由我的投影转换引起的Id那里有一个字符串,不再是我的 Guid 了。但是,省略它不会返回 Id。我必须做什么?

  2. 我必须使用字符串构建"bs/" + r.BId.ToString()加载相关文档。有没有办法不必这样做?是否有某种函数可以为我解析文档标签?

  3. 有没有一种通用的方法可以完全删除文档标签?

我的限制。

我将生成 Guid,但不能让 RavenDb 为我生成它。我知道文档 ID 实际上是字符串,但我确实需要使用我创建的 Guid。我更愿意拥有Id我的实体的财产。

我正在使用 Raven.Client 1.0.972


您可以使用 MultiMap/Reduce 索引来实现此目的,但您需要一些技巧:

1)您需要减少使用字符串,而不是指南。您仍然可以在 AB 类中获取这些值作为指导,正如我将在下面演示的那样。

2)你不能将AB类的第一个属性称为“Id”,因为raven会尝试将其翻译为“__document_id”。所以称之为“AId”,它会工作得很好。

3)在映射阶段,您必须自己操作字符串以去除文档键前缀。

这是一个将所有内容组合在一起的示例程序。这表明它确实有效,但我认为这也说明了为什么 Ayende 更喜欢字符串标识符,这样您就不必处理这种混乱。

using System;
using System.Linq;
using Raven.Client.Document;
using Raven.Client.Indexes;

namespace RavenScratchTest
{
  class Program
  {
    static void Main()
    {
      var documentStore = new DocumentStore { Url = "http://localhost:8080" };
      documentStore.Initialize();
      IndexCreation.CreateIndexes(typeof(Program).Assembly, documentStore);

      using (var session = documentStore.OpenSession())
      {
        var b = new B { Id = Guid.NewGuid(), Name = "Foo" };
        var a = new A { Id = Guid.NewGuid(), BId = b.Id };

        session.Store(a);
        session.Store(b);

        session.SaveChanges();
      }

      using (var session = documentStore.OpenSession())
      {
        var a = session.Query<A>().Customize(x => x.WaitForNonStaleResults()).First();
        var b = session.Query<B>().Customize(x => x.WaitForNonStaleResults()).First();

        Console.WriteLine("A:  Id = {0}", a.Id);
        Console.WriteLine("   BId = {0}", a.BId);
        Console.WriteLine();
        Console.WriteLine("B:  Id = {0}", b.Id);
        Console.WriteLine("  Name = {0}", b.Name);
        Console.WriteLine();

        var guid = a.Id;
        var ab = session.Query<AB, MyIndex>().Customize(x => x.WaitForNonStaleResults())
          .FirstOrDefault(t => t.AId == guid);

        if (ab == null)
          Console.WriteLine("AB: NULL");
        else
        {
          Console.WriteLine("AB:  AId = {0}", ab.AId);
          Console.WriteLine("   BId = {0}", ab.BId);
          Console.WriteLine("   BName = {0}", ab.BName);
          Console.WriteLine();
        }
      }

      Console.WriteLine();
      Console.WriteLine("Done.");
      Console.ReadLine();
    }
  }

  class A
  {
    public Guid Id { get; set; }
    public Guid BId { get; set; }
  }

  class B
  {
    public Guid Id { get; set; }
    public string Name { get; set; }
  }

  class AB
  {
    public Guid AId { get; set; }
    public Guid BId { get; set; }
    public string BName { get; set; }
  }

  class MyIndex : AbstractMultiMapIndexCreationTask<MyIndex.ReduceResult>
  {
    public MyIndex()
    {
      AddMap<A>(docs => from a in docs
                select new
                {
                  AId = a.Id.ToString().Split('/')[1],
                  a.BId,
                  BName = (string)null
                });

      AddMap<B>(docs => from b in docs
                select new
                {
                  AId = (string)null,
                  BId = b.Id.ToString().Split('/')[1],
                  BName = b.Name
                });

      Reduce = results => from result in results
                group result by result.BId
                into g
                select new
                  {
                    g.FirstOrDefault(x => x.AId != null).AId,
                    BId = g.Key,
                    g.FirstOrDefault(x => x.BName != null).BName
                  };
    }

    internal class ReduceResult
    {
      public string AId { get; set; }
      public string BId { get; set; }
      public string BName { get; set; }
    }
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Guid 作为 RavenDB 中的 Id 的相关文章

  • 测试期间应如何处理过时的索引?

    我在内存模式下使用 RavenDB 进行单元测试 我的查询由静态索引支持 我没有使用WaitForNonStaleResults API 我也不想 测试的典型工作流程是 在内存模式下初始化 RavenDB 使用集成索引IndexCreati
  • 如何配置简单注入器 IoC 以使用 RavenDB

    我在用着简易注射器 http simpleinjector codeplex com用于 MVC 3 Web 应用程序中的 IOC 我在用RavenDB http ravendb net用于数据存储 在 mvc 3 应用程序中使用 Rave
  • 从 RavenDB 检索整个数据集合

    我有一个要求 我需要获取整个数据集合Users来自 RavenDB 并将检索到的结果集与另一组数据进行比较 这个特定集合中有近 4000 条记录 因为默认情况下 Raven 是安全的 所以我不断收到以下任一异常Number of reque
  • Azure 网站上的 RavenDb - 访问被拒绝

    我正在尝试 Azure 上的新网站功能 并尝试让 MVC 站点在嵌入模式下与 RavenDB 一起运行 本地一切正常 但在天蓝色中运行部署的站点时出现此错误 System Net NetworkInformation NetworkInfo
  • 安装 RavenDb Embedded 时出现 Nuget 依赖错误

    我正在尝试在 ASP NET MVC 5 应用程序中安装 RavenDB Embedded 但出现以下依赖项错误 PM gt Install Package RavenDB Embedded Attempting to resolve de
  • 保护 Raven 数据库的安全

    我正在尝试将 RavenDB 的访问权限限制为只有一名用户 更改设置以保护数据库后 我仍然可以访问 RavenDB 管理工作室 但我不确定为什么 我将 RavenDB 作为 Windows 服务运行 并且使用构建 573 这是我的 Rave
  • Raven.Client.Exceptions.Database.DatabaseDoesNotExistException:'数据库'*****'不存在

    我在用RavenTestDriver对于我的 net core 单元测试 这是我的配置RavenTestDriver在我的单元测试解决方案中 public class TestHostBuilder RavenTestDriver IAsy
  • 按实体名称和上次修改日期搜索

    我在 RavenDb 中存储了许多命令 它们都实现了 ICommand 我希望能够搜索上次修改的元数据和 Raven Entity Name 我目前正在对每个命令进行多重映射 如下所示 public class CommandAuditSe
  • RavenDB 中使用空格键搜索子字符串

    我正在使用这样的查询 var query QueryParser Escape input session Query
  • 如何限制对ravendb管理面板的访问?

    当默认情况下运行 Raven Server exe 时 管理面板在 IP PORT 地址处可见 如何限制仅特定用户访问此面板 Steve 我们将 RavenDB 作为 Windows 服务运行 并使用 Windows 身份验证来控制访问 如
  • RavenDB 会话 > 30

    如果我尝试保存要保存的项目列表 其中计数 gt 30 我会收到一条错误消息 最大请求数 30 已允许此会话 到达 Raven限制了数量 允许会话的远程调用 作为预警系统 预计会议时间很短 住过 Raven提供设施 像 Load string
  • 使用 RavenDb 查询字典

    我有一个类定义为 public class Student public string Id get set public IDictionary
  • RavenDB 索引错误

    我刚刚开始使用 Raven 我创建的索引始终无法索引任何内容 我在 Raven 服务器上发现了很多如下所示的错误 Index HomeBlurb IncludeTotalCosts Error Cannot implicitly conve
  • RavenDB 错误:我无法从不同的类访问 var 存储。有什么建议

    RavenDB 错误 var 存储不是全局变量 如何创建一个可以使用访问文档存储的类 非常感谢任何有关此代码拒绝运行原因的评论 class Program static void Main string args var store new
  • RavenDB 中的子字符串搜索

    我有一组类型的对象Idea public class Idea public string Title get set public string Body get set 我想通过子字符串搜索这个对象 例如 当我有标题对象 idea 我希
  • 将 RavenDB 与 ServiceStack 结合使用

    I read this http www philliphaydon com 2012 06 using nhibernate with servicestack Phillip Haydon 发表的有关如何将 NHibernate Rav
  • Ravendb:如何删除给定类型的所有文档

    更具体地说 在 Raven DB 中 我想创建一个具有如下签名的通用方法 public void Clear
  • Raven Db 可以在 Winhost 上运行吗?

    我尝试在 Winhost 上以嵌入式模式运行 Ravendb 但我收到以下堆栈跟踪的安全异常 System Security CodeAccessSecurityEngine Check Object demand StackCrawlMa
  • 如何同步nosql db(ravendb)中的更改

    我已经开始在 RavenDB 的示例上学习 NoSQL 我从一个最简单的模型开始 假设我们有由用户创建的主题 public class Topic public string Id get protected set public stri
  • NServiceBus 3.2 示例问题

    我正在尝试运行 AsyncPages 的 NServiceBus 示例 看起来很简单 从 NServiceBus com 下载最新版本 执行bat文件来安装先决条件 打开解决方案 Press F5 在文本框中输入数字 当我这样做时 我遇到了

随机推荐

  • 在哪里可以找到 Microsoft.Office.Interop.Word.dll (2010)?

    我获得了我正在尝试编译的 NET 项目的源代码 尽管如此 该项目使用了 Office 2010 中的引用 命名空间 Microsoft Office Interop Word 但我在任何地方都找不到 我能够下载该文件microsoft of
  • MySQL #1243 给 EXECUTE 的未知预准备语句处理程序 (stmt)

    我正在关注这个tutorial http buysql com mysql 14 how to automate pivot tables html在我安装的 MySQL 版本上 但它抛出一个错误 SET sql NULL SELECT G
  • 使用 gcc 将 C 中的 float 转换为 unsigned int

    我正在使用 gcc 来测试 float 到 unsigned int 之间的一些简单转换 下面这段代码给出的结果是 0 const float maxFloat 4294967295 0 unsigned int a unsigned in
  • Intellij:如何为 javax.annotation.PostConstruct 添加 java.annotation 模块

    我将项目使用的SDK升级到Java 10 以下导入语句导致错误 导入 javax annotation PostConstruct 包 javax annotation 在模块 java xml ws annotation 中声明 但模块
  • Mac 上的临时端口范围是多少?

    我正在尝试对 Web 框架进行基准测试 并发现没有足够的免费临时端口可能会伪造结果 不幸的是 我还没有找到我的 Mac 上的临时端口范围 或者如何显示它 基准测试者 请注意临时端口限制 https web archive org web 2
  • Maven Eclipse 多模块阴影依赖

    在多模块 Maven 项目中 其中一个模块是阴影模块 例如 没有源 但生成一个jar during package阶段 其他模块将此模块作为依赖项引用 全部位于同一父模块下 有没有办法让 Eclipse 将着色模块识别为依赖项 Eclips
  • java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法dispatchCancelPendingInputEvents

    遇到一个问题 我的 Android 应用程序在尝试启动活动时不断崩溃 我无法重现该问题 这只是从发生此问题的多个设备的日志中获取的 堆栈跟踪 2020 03 08 14 58 28 717 5449 5449 I MonoDroid End
  • Android 使用 openssl 构建 PJSIP

    我正在尝试在 Android 上构建具有 SSL TLS 支持的 PJSIP 我成功构建了 OpenSSL 以下这个答案 https stackoverflow com a 11170629 1274789 没有 fips 作为共享 so
  • 在 Pandas 中结合 FacetGrid 和双 Y 轴

    我试图绘制两个不同的变量 通过因果关系链接 delai jour and date sondage在单个 FacetGrid 上 我可以用这段代码做到这一点 g sns FacetGrid df verif sum col prefectu
  • 多行 python 正则表达式

    我有一个结构如下的文件 A some text B more text even more text on several lines A and we start again B more text more multiline text
  • 解析文本最快的方法是什么?

    假设我想提取在某个文本文件中找到的给定字符串后面的第一个单词 或浮点数 请参阅如何提取字符串后面的第一个单词 https stackoverflow com questions 3549877 how to extract the firs
  • 线程同步 - 同步三个线程打印 012012012012..... 不起作用

    我正在尝试同步三个线程来打印 012012012012 但它无法正常工作 每个线程都分配有一个数字 当它收到来自主线程的信号时 它将打印该数字 以下程序有问题 我无法发现 public class Application public st
  • 多平台C++交叉编译器

    如何为 C 库构建交叉编译器以在单个构建服务器上针对多个平台 交叉编译器应该能够为 至少 Windows 7 Mac OS X Ubuntu 11 04 32 位 64 位 调试 发布 构建库 我不在乎从头开始的整个构建是否需要永远 或者是
  • -framework Accelerate,其中包含

    我正在尝试编译别人的代码 但没有简单的头文件 我需要链接 osx 上的默认 lapack 和 blas 库 经过一番搜索后我发现它们位于 Accelerate 框架中 在我的 make inc 中我使用了类似的东西 LAPACK LIBS
  • Handlebars-template 中元素的 Onclick 功能

    我正在使用 Handlebars js 和一些 jQuery 构建一个简单的 Web 应用程序 现在我有一个数据列表 并通过 Handlebars 模板呈现它们 然后我想要一些与这些相关的操作 例如更新一个元素 或者删除一个元素 我有与这些
  • Android - 完全从 xml 创建列表视图

    我想在我的申请中提出一些选择 现在我正在用一个一个的按钮来做这件事 我真正想做的是将它们呈现为一个列表 就像 设置 应用程序中一样 这归结为创建一个包含预定义值 选择的列表 我的问题是我不知道如何使用 xml 来做到这一点 我可以像这样将
  • ReactJS:如何将一个组件覆盖在另一个组件的元素之上?

    我才刚刚开始反应 我有一个带有输入字段和按钮的组件 还有另一个组件返回 JSX 一个闪烁的点 我正在主组件中导入闪烁点组件 并希望在输入字段为空时将闪烁点覆盖在输入字段的顶部 我怎样才能实现这个目标 请帮助我 其代码可以在以下位置找到 ht
  • For 循环总是至少执行一次吗?

    据我的老师说 即使不满足条件 for 循环也总是至少执行一次 示例 就像我从 C 中知道的那样 for int i 6 i lt 5 i irrelevant for this question 据她说 这个循环至少会执行一次 但它没有执行
  • Android 仅当 RecycleView/List 大于屏幕时才 setStackFromEnd

    我有一个 RecyclerView 我想开始显示底部项目 所以我使用 myLayoutManager setStackFromEnd true 当有足够的项目填满屏幕时 它的工作方式正如我想要的那样 但是如果 RecyclerView 中只
  • Guid 作为 RavenDB 中的 Id

    The RavenDb 文档 http ravendb net docs client api basic operations saving new document状态 支持数字或 Guid Id 属性 并且可以无缝工作 在这种情况下