Драйвер MongoDb C #, свойство типа, реализующее IList, не сохраняется - PullRequest
0 голосов
/ 24 января 2011

Изменен уровень персистентности моего веб-приложения на MongoDb с использованием драйверов C # с сайта MongoDb. Был приятно удивлен, когда все мои тесты прошли успешно ... за исключением одного занятия. Одним из его свойств является тип, который реализует IList и по какой-то причине не сохраняет свои элементы.

Я построил минимальный тестовый пример для иллюстрации. Вот тестовый код для создания и сохранения родительского объекта:

var fooCollection = database.GetCollection<Foo>( typeof( Foo ).Name );
var foo = new Foo {Id = "Root"};
foo.Foos.Add( new Foo{ Id = "Child" } );
fooCollection.Save( foo );

Если я объявляю Foo.Foos как List<Foo>, это работает:

public class Foo {
  public Foo() {
    Foos = new List<Foo>();
  }
  public List<Foo> Foos;
  public string Id;
}  

(правильный) результат:

{ "_id" : "root", "Foos" : [ { "Foos" : [], "_id" : "child" } ] }

Однако мне нужно вот что:

public class Foo {
  public Foo() {
    Foos = new FooList();
  }
  public FooList Foos;
  public string Id;
}

public class FooList : IList<Foo> {
   //IList implementation omitted for brevity
}

(Неверный) результат:

{ "_id" : "root", "Foos" : { "Capacity" : 4 } }

Обратите внимание, что это не имеет ничего общего с моей реализацией IList, поскольку результаты будут такими же, если я использую FooList : List<Foo>.

Я предполагаю, что сериализатор BSON запутался? Я посмотрел документацию по дискриминаторам, из-за чего я подумал, что это может помочь:

BsonClassMap.RegisterClassMap<List<Foo>>( cm => {
  cm.AutoMap();
  cm.SetIsRootClass( true );
} );
BsonClassMap.RegisterClassMap<FooList>();    

Я все еще не сохраняю свои вещи, в конечном итоге выглядит так:

{ "_id" : "root", "Foos" : { "_t" : [ "List`1", "FooList" ], "Capacity" : 4 } }

Как правильно сохранить FooList?

1 Ответ

0 голосов
/ 25 января 2011

Я могу воспроизвести то, что вы описываете с помощью 0.9, но оно корректно работает с последним кодом.

Вы можете собрать драйвер самостоятельно из последнего кода в github или дождаться0,11, который скоро появится.

- Роберт Стам, в группе пользователей monodb-пользователя

...