Ошибка сериализации наследования репозитория MongoRepository

При попытке объединить наследование с MongoRepository для C# у меня возникают ошибки сериализации.

Действительно странная вещь - это работает в течение короткого времени, но после, скажем, перестройки или чего-то такого, что не получается. Если я урону коллекцию и создам новую, она будет работать до остановки или перестройки.

Мой код выглядит так:

public class Organization
{
      // other attributes removed for demonstration simplicity

      public List<Person> People { get;set; }
}

public abstract class Person
{
      public string Id {get;set;}
      public string Name {get;set;}
}

public class Employee : Person 
{
      public string Badge {get;set;}
}

public class Contractor : Person
{
     public string Company {get;set;}
}

Когда я пытаюсь получить это как:

static MongoRepository<Organization> apps = new MongoRepository<Organization>();
return apps.Single(c => c.Id == id);

Я получаю ошибку:

Исключение типа "System.IO.FileFormatException" произошло в MongoDB.Driver.dll, но не было обработано в коде пользователя

Дополнительная информация: Произошла ошибка при десериализации свойства People класса API.Models.Organization: Экземпляры абстрактных классов не могут быть созданы.

2 ответа

Решение

Добавление атрибутов декоратора:

[BsonKnownTypes(typeof(Contractor), typeof(Employee))]

чтобы классы решили проблему.

Была похожая проблема, где Person был абстрактный класс, унаследованный от другого абстрактного класса. Мне не понравилась идея добавить атрибуты Mongo в мою модель предметной области, и, немного поиграв с ней, обнаружил маркировку Person Класс как корень делает его сериализованным и десериализованным должным образом:

BsonClassMap.RegisterClassMap<Person>(cm => {
    cm.SetIsRootClass(true);
});

Обратите внимание, что исключение десериализации произошло, потому что драйвер MongoDB не устанавливал дискриминатор _t поле.

Другие вопросы по тегам