我刚刚在现有的Foo类中添加了一个新属性(Deleted):
public class Foo
{
// Other properties here
public bool Deleted { get; set; } // New property
}
我在DB中有88个Foos。当我尝试通过这个新属性进行查询时,我没有得到任何文档:
session.Query<Foo>().Where(x => x.Deleted == false);
我认为这是因为数据库中的任何Foo文档都不存在Deleted属性。为了使这个工作,我必须得到所有Foos,然后过滤完整列表并返回Deleted == false。
session.Query<Foo>();
return foos.Where(x => x.Deleted == false);
这是否需要处理这样的变更?在查询本身中使用Where()过滤器会很好,但我可以理解为什么这样做不起作用。
答案 0 :(得分:2)
已删除的属性在存储在数据库中的实际文档中尚不存在,因此这就是您无法根据此属性查询它们的原因。
解决此问题的方法是首先将此属性添加到实际文档中。您只需加载所有文档即可保存会话。
以下是如何实现该示例的示例代码:
public void LoadAndSave<T>()
{
using (var session = store.OpenSession())
{
int skip = 0;
const int take = 1024;
while (true)
{
var builds = session.Query<T>()
.Skip(skip)
.Take(take)
.ToList();
skip += builds.Count;
session.SaveChanges();
if (builds.Count == 0)
break;
}
}
}
答案 1 :(得分:0)
我以为我会发布另一个简单易行的选项。
在Raven Studio中,您可以在“修补程序”选项卡上执行修补程序。您可以修补集合,以便现在每个文档都存在该属性。只需将属性设置为等于自身即可。如果该属性已存在,则仅设置为自身。如果该属性不存在,则将其添加为null。现有信息依旧;没有信息丢失。
这是执行的代码:
this.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds = this.ApplicationWithOverrideVariableGroup.CustomVariableGroupIds;