在将多个类移动到新的命名空间后,我需要更新RavenDB Raven-Clr-Type.

Example Old Metadata:

"@metadata": {
    "@collection": "SomeClass",
    "Raven-Clr-Type": "BO.SomeClass, BO"
}

Example New Metadata:

"@metadata": {
    "@collection": "SomeClass",
    "Raven-Clr-Type": "BO.SubNamespace.SomeClass, BO.SubNamespace"
}

我考虑过的一种方法是加载一个带有Query的集合,对列表进行迭代,并在数据库中分别对每个对象使用Store.这似乎工作得很好,但不幸的是,单独存储每个对象对于大型集合来说效率非常低.我曾try 使用RavenDB的Bulk Insert方法作为替代方法,但它似乎并没有更新Raven-Clr-Type,只是更新了"数据".

在名称空间更改后需要更新Raven-Clr-Type与我们如何按ID查询相关联.当按ID加载对象时,我们执行严格的类型判断,如果名称空间不匹配,我们将返回错误.

using var bulkInsertOperation = Store.BulkInsert(new BulkInsertOptions
{
    SkipOverwriteIfUnchanged = false
});
foreach (var item in list)
{
    bulkInsertOperation.Store(item);
}

我的问题是:

  • 实现我的目标最有效的方法是什么?

推荐答案

发送一个Patch operation,这对你来说应该是有效的:

var operation = store
    .Operations.Send(new PatchByQueryOperation(new IndexQuery
    {
        Query = @"from YourCollectionName update
                {                                      
                    this['@metadata']['Raven-Clr-Type'] = 'TheNewNameSpaceYouWant';                                      
                }"
    }));
    
operation.WaitForCompletion();

There are more examples of set-based operations here:
https://ravendb.net/docs/article-page/6.0/csharp/client-api/operations/patching/set-based

Csharp相关问答推荐

C#将参数传递给具有变化引用的变量

我无法在Ubuntu下编译使用microsoft.extension.configurationbuilder jsonapi和mono mcs的c#应用程序

如何从泛型方法返回一个可为空的T,其中T:notnull?

EF Core. Income和. AsNoTracking正确用法

迭代C#List并在数据库中 for each 元素执行SELECT语句—更有效的方式?

在具有主构造函数的类中初始化属性时出现警告

在.NET MAUI.NET 8中如何防止按钮点击时出现灰色反馈

Savagger使用Fastendpoint更改用户界面参数

具有以接口为其类型的属性的接口;类指定接口的实现,但无效

Linux Docker上的.NET6在某个时间抛出后,在加密操作期间发生System.Security.Cryptography.CryptographicException:错误

同一组件的多个实例触发相同的事件处理程序

在C#中有没有办法减少大型数组中新字符串的分配?

类/值和日期的泛型方法

Blazor服务器项目中的Blazor/.NET 8/Web API不工作

Autofac -动态实例化:手动传递构造函数

如何在.NET MAUI上在iOS和Mac之间共享代码?(no条件编译和无代码重复)

如何阻止可传递依赖项出现在项目中

使用免费的DotNet库从Azure函数向Azure文件共享上的现有Excel文件追加行

能否将我图表中的星号与X轴上一天中的第二位数字对齐?

ASP.NET Core 7空字符串