LiteDB Обновление коллекции - PullRequest
0 голосов
/ 12 апреля 2019

Я тестирую базу данных LiteDB, но у меня проблема с обновлением данных.Давайте рассмотрим исходный код:

    public class Session
    {
        [BsonId]
        public int Id { get; set; }
        public Guid SessionGuid { get; set; }
        public DateTime Date { get; set; }
        public double TotalAmount { get; set; }

        [BsonRef("paymentInfos")]
        public PaymentInfo PaymentInfos { get; set; }
    }

    public class PaymentInfo
    {
        [BsonId] 
        public int Id { get; set; }
        public string Type { get; set; }
        public double Amount { get; set; }    
    }

_database = new LiteDatabase(databasePath);

var sessions = _database.GetCollection<Session>("sessions");

var sessionId = Guid.NewGuid();
var session = new Session
{
    SessionGuid = sessionId,
    Date = Datetime.Now
};
sessions.Insert(session);


var sessions = _database.GetCollection<Session>("sessions");
var session = sessions.FindOne(x => x.SessionGuid == sessionId);

var paymentInfo = new PaymentInfo
{
    Type = "Coin",
    Amount = 2.0,
};

var paymentInfos = _database.GetCollection<PaymentInfo>("paymentInfos");
paymentInfos.Insert(paymentInfo);

session.PaymentInfos = paymentInfo;
sessions.Update(session);

session = sessions.FindOne(x => x.SessionGuid == sessionId);
var paymentAmount = session.PaymentInfos.Amount;

Я ожидал, что paymentAmount будет равен 2.0, но равен только 0. Это похоже только на session.PaymentInfos.Id, но все остальные свойства потеряны.Что-то не так с моим обновлением сессии?Может быть, я что-то пропустил?

Заранее спасибо.

1 Ответ

0 голосов
/ 17 апреля 2019

При работе со ссылками на коллекцию необходимо Include другую коллекцию: sessions.Include(x=>x.PaymentInfos).FindOne(x => x.SessionGuid == sessionId)

Документация LiteDb описывает поведение, которое вы видите:

Если вы не используете Include в запросе, классы загружаются только с установленным идентификатором (все остальные свойства останутся со значением по умолчанию / нулевым значением).

При этом может быть лучшеизбегать использования DbRef.LiteDb - это нереляционная база данных, поэтому она использует другие шаблоны, чем традиционная база данных SQL.Чтобы процитировать Stack Exchange ответ о лучших практиках NoSql:

Подходящим подходом для проектирования баз данных NoSQL является DDD (Domain Driven Design).Для некоторых людей, которые раньше проектировали RDBMS, NoSql выглядит как анти-паттерны Sql, и это имеет больше смысла, когда рассматривается в области DDD.

Когда я впервые переключился с SQL на LiteDB, я началиспользуя DbRef и отдельные коллекции для всего.Со временем я стал больше тренироваться думать нереляционно, и обнаружил, что сценарий использования, над которым я работал (отношения между объектами, расположенными в трехмерном пространстве), может быть более точно смоделирован путем хранения информации внутри объектов, а не использования отдельной коллекции иDbRef.

...