4

$type当我保存动态类型值时,有没有办法防止添加属性?

当我保存这个时:

new Activity {
    Name = "FormFieldDeleted",
    Body =  new {
        MyDeletedFormField(),
        MyCompleteForm()
    }
}

我明白了

<>f__AnonymousType1`2[[MyProject.Domains.Forms.Models.FormField, MyProject.Domains.Forms],[MyProject.Domains.Forms.Entities.FormRegistration, MyProject.Domains.Forms]], MyProject.Api.Forms

但是当我尝试获取这个保存的实体时,它会崩溃并出现以下异常。我知道它缺少项目引用,但我真的不想添加该引用(我不想从控制台应用程序引用 API)。我最好只是阻止$type财产。

/usr/local/share/dotnet/dotnet path/MyProject/MyProject/src/MyProject.Tasks.MapActivities/bin/Debug/netcoreapp3.1/MyProject.Tasks.MapActivities.dll
Unhandled exception. System.InvalidOperationException: Could not convert document 31317d58-db9e-4f60-8dee-b8593f3e06c0 to entity of type MyProject.Domains.Core.Entities.Activity
 ---> Newtonsoft.Json.JsonSerializationException: Error resolving type specified in JSON '<>f__AnonymousType1`2[[MyProject.Domains.Forms.Models.FormField, MyProject.Domains.Forms],[MyProject.Domains.Forms.Entities.FormRegistration, MyProject.Domains.Forms]], MyProject.Api.Forms'. Path 'Body.$type'.
 ---> Newtonsoft.Json.JsonSerializationException: Could not load assembly 'MyProject.Api.Forms'
....
4

2 回答 2

5

是的,有办法。
您可以使用以下代码自定义序列化的工作方式:

store.Conventions.CustomizeJsonSerializer = serializer =>
{
   serializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.None;
};

例如,看看这里的代码:https ://dotnetfiddle.net/voJ7US

如果你在dotnetfiddle执行代码,你可以在这里看到结果:http: //live-test.ravendb.net/studio/index.html#databases/documents ?collection=Activities&database=UniqueTestDB

于 2020-05-02T13:33:10.337 回答
1

对于 RavenDB 5 及更高版本,它发生了一些变化。

var store = DocumentStore
{
    Urls = new[] { "your-endpoint" },
    Conventions = new DocumentConventions
    {
        Serialization = new NewtonsoftJsonSerializationConventions
        {
            CustomizeJsonSerializer = serializer =>
            {
                serializer.TypeNameHandling = Newtonsoft.Json.TypeNameHandling.None;
            }
        }
    }
}.Initialize();

有关更多信息,请参阅https://ravendb.net/docs/article-page/5.0/file-header/migration/client-api/conventions

于 2020-09-02T10:24:18.940 回答