2015-08-18 3 views
1

У меня проблема с MongoDriver. У меня есть унаследованный класс из Class1 репозитория mongo для Class1. Например:MongoDriver Deserialization

public class Class1: EntityBase 
{ 
    [BsonElement("a")] 
    public A Attr { get; set; } 
} 

public class Class2: Class1 
{ 
    [BsonElement("d")] 
    public IList<float> D{ get; set; } 

    [BsonElement("p")] 
    public int P{ get; set; } 

    [BsonElement("s")] 
    public int S{ get; set; } 
} 

И у меня есть несколько проектов в моем решении. У меня есть проект с репозиториями, где расположены классы. Когда я пытаюсь вставить и загрузить экземпляр класса 2 в первый проект, так что все в порядке. Но когда я пытаюсь сделать то же самое в другом:

Element 'd' does not match any field or property of class Class1. 

Оба проекта относятся к проекту репозитория (dll). Что может быть неправильным?

+0

Попробуйте добавить '[BsonIgnoreExtraElements]' на 'Class1'. – Donut

+0

Я исправляю свою проблему с атрибутом '[BsonKnownTypes]' на 'Class1'. Причина, по которой она работает в одном проекте, а не в другом, проста. Рабочий использует унаследованный тип, поэтому он регистрирует его. Второй проект не может и не может десериализоваться на неизвестный тип. – wolen

+0

Рад, что вы смогли это решить! Можете ли вы опубликовать ответ на свой вопрос, чтобы другие, у которых может быть одна и та же проблема, могли более легко увидеть, как вы его исправили? – Donut

ответ

1

Я нашел solotuion. Class1 должны иметь атрибут Монго [BsonKnownTypes]

Так Class1 должно выглядеть:

[BsonKnownTypes(typeof(Class2))] 
public class Class1: EntityBase 
{ 
    [BsonElement("a")] 
    public A Attr { get; set; } 
} 

Причина, почему один проектные работы, а другой один кидает исключение было просто. Первый из них - Class2 и вставляет экземпляр в репозиторий, так что mongoDriver регистрирует унаследованный тип. После этого он смог десериализовать сохраненный экземпляр до Class2. Второй не имел понятия о Class2, поэтому он попытался десериализовать объект до Class1, и он исключил исключение из uknown элемента 'd'.