Подтвердить что ты не робот

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

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

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

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

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: экземпляры абстрактных классов не могут быть созданы.

4b9b3361

Ответ 1

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

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

классам разрешена проблема.

Ответ 2

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

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

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