RavenDB:在文档转换期间访问数据库实例

时间:2012-07-25 15:17:20

标签: migration ravendb data-conversion

我需要一些关于Raven DB及其C#API的帮助。 我想用Linq查询(使用Linq to Raven实现)执行“order by”。为此,我必须创建一个索引来实现此操作。我的架构目前已规范化,但我想对其进行非规范化,以便在其中添加自定义属性。

所以,我有:

实体A:

  • 一些属性
  • B实体的ID

事实上,我只是想通过B属性订购我的As。所以我想对我的A进行非规范化以包含B属性。

因此使用RavenDB可以实现方案演变,但是为了在A中设置B属性,我必须在转换A时加载B.根据文档,这似乎是不可能的。

我不想构建一个令人毛骨悚然的程序,它将迭代每个A来加载B,但我没有看到另一个解决方案。

有什么想法吗?

感谢您的时间:)。 于连

1 个答案:

答案 0 :(得分:1)

你不应该编写一个令人毛骨悚然的程序,而是一个强大的迁移项目,它将包含大量有用的迁移脚本。像波纹管这样的简单脚本将为您完成工作:

public void LoadAndSaveWithDenormalizedProperty()
{
    using (var session = store.OpenSession())
    {
        int skip = 0;
        const int take = 24;
        while (true)
        {
            var items = session.Query<ItemA>()
                .Customize(customization => customization.Include(x => x.ItemBId))
                .Skip(skip)
                .Take(take)
                .ToList();
            skip += items.Count;

            foreach (item in items)
            {
                item.DenormalizedProperty = 
                       session.Load<ItemB>(item.ItemBId).PropertyToDenormalize;
            }

            session.SaveChanges();

            if (items.Count == 0)
                break;
        }
    }
}