1. Name
свойство не было сохранено в базе данных, поскольку оно не имеет установщика. Сериализаторы не сериализуют свойства, которые не имеют сеттеров (потому что если сериализатор сериализует такое свойство, он не сможет десериализовать его обратно). Поэтому, если вы хотите сериализовать свойство Name
, просто добавьте поддельный сеттер (в ICommand
нужно добавить его):
public override string Name
{
get { return "Move Command"; }
set{}
}
2.Если вы не хотите использовать атрибут BsonKnownTypes, существует другой способ уведомить сериализатор о известных типах, с которыми он может столкнуться во время десериализации. Просто зарегистрируйте карты один раз, при запуске приложения:
BsonClassMap.RegisterClassMap<MoveCommand>();
//all other inherited from ICommand classes need register here also
Таким образом, вы должны использовать или KnownTypes
атрибут или регистр BsonClassMap
для каждого полиморфного класса, в противном случае вы получите ошибку 'unknown descriminator' во время десериализации:
var commands = col.FindAllAs<ICommand>().ToList();
3 Вы сказали:
Это плохой ОО дизайн и сейчас
вынужден на моей иерархии классов по
Библиотека BSON.
В любом случае, даже без KnownTypes
присвойте свой код, используя Bson lib через атрибут BsonId
.
Если вы хотите избежать этого, вы можете:
BsonClassMap.RegisterClassMap<MoveCommand>(cm => {
cm.AutoMap();
cm.SetIdMember(cm.GetMemberMap(c => c.Id));
});
Теперь вы можете удалить ссылку на Mongodb.Bson
lib из кода вашего домена lib.