我有一个叫米的实体(想想电表)。
仪表有一组数据点。每15分钟左右,新的数据点将添加到仪表中。仪表具有这些数据点的集合。
我想对此进行编码,例如Meter myMeter = session.get<Meter>(id)
然后myMeter.AddDataPoint(point)
然后session.Update(myMeter)
。在内部,Meter类有一个集合(IESI.ISet<DataPoint>
)。但是当我添加到这个集合时,我认为NHibernate首先必须初始化集合并从数据库加载它。问题是这个系列中会有成千上万的物品,而且效率不高。因此可以对其进行编码,以便NHiberante盲目地添加到集合中,而不会加载其所有值。
DataPoint类具有与Meter的多对一映射,而Meter具有DataPoints的集映射。
答案 0 :(得分:3)
1) 您可以从Meter类中删除集映射。这样,您就不会意外地加载数千个数据点。稍后当您需要了解Meter的所有DataPoints时,您可以动态加载它。看起来您大多数时间都需要数据点的子集(Meter X for August的数据点)。
List<DataPoint> dp = DataPointsRepository.FindByMeter(Meter meter)
List<DataPoint> dp = DataPointsRepository.FindByMeter(Meter meter, DateRange range)
DataPoint仍然需要多对一的计量关系才能正确关联和保存。
2)您可以尝试使用'bag'而不是'set',但要注意不要调用obj.MyBag.Size()等方法 相关问题: Hibernate - How to persist a new item in a Collection without loading the entire Collection
答案 1 :(得分:0)
ISet实现的语义要求NHibernate提取完整的项集合,以便它可以验证您尝试添加的点确实是唯一的。我不认为除了检查数据/保持它独立于仪表之外还有其他办法。
(使用QueryOver):
var pointExists = session.QueryOver<DataPoint>().Where(p => p.Id==id /* etc */).Any();
if (!pointExists) {
session.Save(dataPoint);
}