LiteDB 更新集合
LiteDB Update collection
我正在测试 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 是好的,但所有其他属性都丢失了。
我的会话更新有问题吗?也许我错过了什么?
提前致谢。
使用集合引用时,您需要 Include
其他集合:
sessions.Include(x=>x.PaymentInfos).FindOne(x => x.SessionGuid == sessionId)
LiteDb documentation 描述了您看到的行为:
If you do not use Include
in query, classes are loaded with only ID set (all other properties will stay with default/null value).
也就是说最好避免使用 DbRef
。 LiteDb 是一种非关系型数据库,因此它受益于与传统 SQL 数据库不同的模式。引用 Stack Exchange answer 关于 NoSql 最佳实践:
Appropriate approach for NoSQL database design is a DDD (Domain Driven Design ). For some people who used to design RDBMS, NoSql looks like Sql anti-patterns and it make more sense when considered in a scope of a DDD.
当我第一次从 SQL 切换到 LiteDB 时,我开始使用 DbRef
并为所有内容单独收集。随着时间的推移,我得到了更多非关系思考的练习,并且我发现我正在处理的用例(3d space 中定位的对象之间的关系)可以通过在对象内部存储信息而不是使用来更准确地建模一个单独的集合和 DbRef
。
我正在测试 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 是好的,但所有其他属性都丢失了。 我的会话更新有问题吗?也许我错过了什么?
提前致谢。
使用集合引用时,您需要 Include
其他集合:
sessions.Include(x=>x.PaymentInfos).FindOne(x => x.SessionGuid == sessionId)
LiteDb documentation 描述了您看到的行为:
If you do not use
Include
in query, classes are loaded with only ID set (all other properties will stay with default/null value).
也就是说最好避免使用 DbRef
。 LiteDb 是一种非关系型数据库,因此它受益于与传统 SQL 数据库不同的模式。引用 Stack Exchange answer 关于 NoSql 最佳实践:
Appropriate approach for NoSQL database design is a DDD (Domain Driven Design ). For some people who used to design RDBMS, NoSql looks like Sql anti-patterns and it make more sense when considered in a scope of a DDD.
当我第一次从 SQL 切换到 LiteDB 时,我开始使用 DbRef
并为所有内容单独收集。随着时间的推移,我得到了更多非关系思考的练习,并且我发现我正在处理的用例(3d space 中定位的对象之间的关系)可以通过在对象内部存储信息而不是使用来更准确地建模一个单独的集合和 DbRef
。