У меня есть несколько вопросов, которые тесно связаны, поэтому я группирую их по этому вопросу.Сериализация сложных объектов для mongoDB
Я пытаюсь создать постоянный db для моей объектной модели с использованием C# и драйверов и базы данных mongoDB. Я хочу иметь возможность хранить все мои объекты-пользователи - внутри этих пользователей должны быть сеансы («список» или подобная структура данных), и в каждом сеансе есть разные события и записи, которые они создали (также списки). Когда выполняется новый запрос, я сначала ищу пользователя по его идентификатору. Если он существует, я создаю объект сеанса. Добавьте этот объект сеанса в список сеансов пользователя, а затем выполните соответствующие обновления (добавление событий или записей в сеансы). (иначе я создаю нового пользователя - добавьте его в db, а затем выполните предыдущие шаги)
Моя проблема в том, что когда я делаю "collection.save(user)"
или "find(user)"
Я получаю ошибки - не может сериализовать абстрактный класс. Per the documentation Я мог бы использовать функцию «авто-картографирования», поэтому я думал, что это будет работать из коробки. Это было бы прекрасно. Я хотел бы, чтобы мой объект db отображался как только контейнер для моих пользовательских объектов, как в классе UsersDb.
Если нет - существуют ли соответствующие классы контейнеров «mongodb», я могу использовать (т. Е. Вместо «List<Session>
» использовать ->BsonList<Session>
)? Также как мне нужно создавать экземпляры контейнеров внутри моих классов? Если они генерируются сериализатором, я должен инициировать их в конструкторе? Кроме того, как я могу хранить произвольные «динамические» данные в моих классах (только некоторые регулярные JS)
Я создаю основную коллекцию, как это:
public class UsersDb
{
public UsersDb()
{
MongoServerSettings settings =new MongoServerSettings();
settings.Server = new MongoServerAddress("localhost",27017);
MongoServer server = new MongoServer(settings);
MongoDatabase db = server.GetDatabase("defaultDb");
Users = db.GetCollection<User>("Users");
//Users.Drop();
}
public MongoCollection<User> Users { get; set; }
}
Вот мой пользовательский класс: уже здесь у меня есть потому что конструктор должен иметь возможность создавать список сеансов, но что произойдет, если он был сериализован драйвером mongo?
public User()
{
SessionComparer uc = new SessionComparer();
Sessions = new List<Session>();;
}
public ObjectId Id { get; set; }
public string Udid { get; set; }
public DateTime EnrollDate { get; set; }
public string Email { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public List<Session> Sessions { get; set; }
Моей сессия класс
public class Session
{
public Session()
{
Events = new List<Event>();
Records = new List<Record>();
}
public string SessionId { get; set; }
public DateTime Time { get; set; }
public dynamic Parameters { get; set; }
public IList<Event> Events { get; set; }
public IList<Record> Records { get; set; }
}
Запись
public class Record
{
public Record()
{
RecordId = Guid.NewGuid().ToString();
CreatedAt = DateTime.Now;
}
public string Name { get; set; }
public string RecordId { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime Time { get; set; }
public dynamic Data { get; set; }
}
и событие
public class Record
{
public Record()
{
RecordId = Guid.NewGuid().ToString();
CreatedAt = DateTime.Now;
}
public string Name { get; set; }
public string RecordId { get; set; }
public DateTime CreatedAt { get; set; }
public DateTime Time { get; set; }
public dynamic Data { get; set; }
}
Какие классы здесь абстрактны? Не могли бы вы полностью разместить сообщение об исключении? –
Вот сообщение, которое я получаю: {«Сообщение»: «Произошла ошибка.», «ExceptionMessage»: «Невозможно создать абстрактный класс.», «ExceptionType»: «System.MissingMethodException», «StackTrace»: в System.RuntimeTypeHandle.CreateInstance (RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean & canBeCached, RuntimeMethodHandleInternal & ctor, Boolean & bNeedSecurityCheck) \ r \ n –