我正在测试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;
我原本期望payAmount为2.0,但是只有0。 就像仅session.PaymentInfos.Id是好的,但所有其他属性都已丢失。 我的会话更新有问题吗?也许我错过了什么?
谢谢。
答案 0 :(得分:0)
使用集合引用时,您需要Include
其他集合:
sessions.Include(x=>x.PaymentInfos).FindOne(x => x.SessionGuid == sessionId)
LiteDb documentation描述了您所看到的行为:
如果您在查询中不使用
Include
,则仅使用ID集来加载类(所有其他属性将保留默认值/空值)。
话虽如此,最好避免使用DbRef
。 LiteDb是一个非关系数据库,因此与传统的SQL数据库相比,它受益于不同的模式。引用有关Stack Exchange answer的NoSql最佳做法:
NoSQL数据库设计的适当方法是DDD(域驱动设计)。对于某些曾经设计RDBMS的人来说,NoSql看起来像Sql反模式,在DDD范围内考虑时,它更有意义。
当我第一次从SQL切换到LiteDB时,我首先使用DbRef
并对所有内容使用单独的集合。随着时间的流逝,我得到了更多的非关系思考的练习,并且发现我正在处理的用例(位于3d空间中的对象之间的关系)可以通过在对象内部存储信息而不是使用单独的集合和模型来更准确地建模。 DbRef
。