Драйверът MongoDB .NET предлага няколко възможности в такива случаи:
Полиморфизъм
Можете да изградите йерархия от класове и драйверът на MongoDB ще може да определи типа на обект, който се извлича от базата данни:
[BsonKnownTypes(typeof(Post), typeof(NewTypePost))]
public abstract class PostBase
{
[BsonId]
public string Id { get; set; }
}
public class Post: PostBase
{
public string Message { get; set; }
}
public class NewTypePost: PostBase
{
public string Image { get; set; }
}
Драйверът MongoDB ще създаде допълнително поле _t
във всеки документ, който ще представлява съответния клас.
Единичен клас
Все още можете да имате Post
клас и използвайте BsonIgnoreIfNull
атрибут за избягване на изключение при сериализация. Драйверът MongoDB .NET ще зададе тези свойства на null
ако не съществуват във вашата база данни.
public class Post
{
[BsonId]
public string Id { get; set; }
[BsonIgnoreIfNull]
public string Message { get; set; }
[BsonIgnoreIfNull]
public string Image { get; set; }
}
BsonDocument
Можете също така да се откажете от строго типизирания подход и да използвате BsonDocument
клас, който е динамична подобна на речник структура, която представлява вашите Mongo документи
var collection = db.GetCollection<BsonDocument>("posts");
Повече подробности тук
динамичен
Указване на dynamic
като общ параметър на ICollection
трябва да получите списък с ExpandoObject
който ще съдържа всички стойности, които имате във вашата база данни.
var collection = db.GetCollection<dynamic>("posts");
var data = collection.Find(Builders<dynamic>.Filter.Empty).ToList();
var firstMessage = data[0].Message; // dynamically typed code