Драйвер Mongo db C # генерирует исключение при отображении сложных классов - PullRequest
1 голос
/ 12 марта 2012

У меня проблемы с отображением некоторых классов с помощью BsonClassMap. У меня есть 3 класса, как это:

abstract class A {
  public string FirstName { get; set; }
}

abstract class B : A{
  public string LastName { get; set; }
}

class C : B {
  public int Age { get; set; }
}

Я хочу, чтобы только свойства, видимые в классе C, отображались в базу данных.

BsonClassMap.RegisterClassMap<C>(map =>
{
  map.MapProperty(c => c.FirstName).SetElementName("fn");
  map.MapProperty(c => c.LastName).SetElementName("ln");
  map.MapProperty(c => c.Age).SetElementName("age");
});

Это вызывает исключение, и из того, что мне удалось выяснить, похоже, что свойства не принадлежат классу C. Как мне отобразить такую ​​структуру?

Ответы [ 2 ]

4 голосов
/ 12 марта 2012

Способ работы карт классов в иерархии наследования заключается в том, что вы регистрируете карту классов для каждого класса в иерархии, и каждая карта классов определяет только свойства, присутствующие в этом классе.Итак, вы хотите зарегистрировать все три класса следующим образом:

BsonClassMap.RegisterClassMap<A>(map =>
{
    map.MapProperty(a => a.FirstName).SetElementName("fn");
});
BsonClassMap.RegisterClassMap<B>(map =>
{
    map.MapProperty(b => b.LastName).SetElementName("ln");
});
BsonClassMap.RegisterClassMap<C>(map =>
{
    map.MapProperty(c => c.Age).SetElementName("age");
});

Вы можете быстро протестировать его с помощью следующего кода:

var document = new C { FirstName = "John", LastName = "Doe", Age = 33 };
Console.WriteLine(document.ToJson());

, который выдает:

{ "fn" : "John", "ln" : "Doe", "age" : 33 }

Или вы можете использовать атрибуты для аннотирования ваших классов, что часто намного проще, но требует создания зависимости от драйвера C # в ваших классах модели данных.

0 голосов
/ 12 марта 2012

Вы можете добавить атрибут BsonIgnore к свойствам класса A, которые вы не хотите хранить в базе данных.Просто добавьте [BsonIgnore] над свойством, и оно будет проигнорировано.

Существует также атрибут BsonIgnoreIfNull, который выполняет только то, что говорит - игнорирует элемент, если значение равно нулю.Очень полезно в тех случаях, когда вы не хотите обнулять значения в базе данных и тратить пустой диск \ память.

Кроме того, вы можете использовать атрибут BsonElement, чтобы изменить имя:

abstract class B : A{
  [BsonElement("ln")]
  public string LastName { get; set; }
}
class C : B {
  [BsonElement("age")]
  public int Age { get; set; }
}
...