我正在测试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是好的,但是其他所有的属性都已经丢失了。我的会话更新有问题吗?也许我漏掉了什么?
提前谢谢。
发布于 2019-04-17 17:50:27
在处理集合引用时,需要对另一个集合进行Include:sessions.Include(x=>x.PaymentInfos).FindOne(x => x.SessionGuid == sessionId)
LiteDb文档描述了您所看到的行为:
如果在查询中不使用
Include,则类只加载ID集(所有其他属性都保留默认值/空值)。
尽管如此,最好避免使用DbRef。LiteDb是一个非关系数据库,与传统的SQL数据库相比,它从不同的模式中获益。引用关于堆栈交换应答的NoSql最佳实践:
适合于NoSQL数据库设计的方法是领域驱动设计。对于一些曾经设计关系数据库管理系统的人来说,NoSql看起来像,在DDD的范围内考虑它更有意义。
当我第一次从SQL切换到LiteDB时,我从使用DbRef开始,并对所有内容使用单独的集合。随着时间的推移,我有了更多的非关系思考的实践,我发现我正在研究的用例(位于3d空间中的对象之间的关系)可以通过在对象中存储信息来更精确地建模,而不是使用单独的集合和DbRef。
https://stackoverflow.com/questions/55648335
复制相似问题