我有一个查询父记录的数据库(在本例中为视图)的方法,获取并更新每个父记录的子项,保存子记录,然后查询父记录。子和父之间存在一对一的关系,但关系未在映射文件中定义。通过直接向数据库发出select,我可以看到更新正在保存到数据库中,但是当我在代码中执行第二次查询时,更新不包含在结果中。为什么第二个查询没有返回更新?
代码粗略轮廓:
public void UpdateRecords(long aParentId)
{
IList<Parent> parents = parentRepository.GetParentById(aParentId);
foreach (Parent parent in parents)
{
Child childToUpdate = childRepository.GetChildById(parent.GetChildId());
... Update Child ...
childRepository.SaveChild(childToUpdate);
}
IList<Parent> parents = parentRepository.GetParentById(aParentId);
}
class ParentRepository : NHRepository
{
public IList<Parent> GetParentById(long anId)
{
DetachedCriteria criteria =
DetachedCriteria.For<Parent>()
.Add(Restrictions.Eq("Id", anId));
return FindAll(criteria).ToList();
}
}
class ChildRepository : NHRepository
{
public Child SaveChild(Child aChild)
{
Child savedChild = null;
using (UnitOfWork.Start())
{
savedChild = base.SaveOrUpdate(aChild);
UnitOfWork.Current.Flush(); // commit
}
return savedChild;
}
}
答案 0 :(得分:0)
您的FindAll()方法是什么样的?它可能是对GetParentById()调用使用相同的UnitOfWork / Session,而子存储库正在使用另一个UnitOfWork / Session。
如果是这种情况,则第二个GetParentById()调用是从会话(第一级)缓存返回对象,而不是访问数据库。
编辑:您可以浏览Rhino.Commons的源代码:
https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/commons/Rhino.Commons.NHibernate/
Session封装在Rhino.Commons.UnitOfWork类中。我不熟悉Ayende对UnitOfWork的实现,所以我无法为你提供最好的解决方案,但是这里有一些东西可以让你入门....
尝试致电
Session.Clear();
位于GetParentById()方法的顶部。
我再说一遍,你可能需要找到一个更好的方法(可能是通过使用UnitOfWork),但这应该清除会话缓存中的所有对象,从而在下次请求时从数据库中加载新对象。
答案 1 :(得分:0)
尝试在事务中包围SaveUpdate()。然后在完成后提交事务,这将确保在您提交时将更改写入数据库:
这样的事情很常见:
using (var trans = session.BeginTransaction()) {
session.SaveUpdate(e);
trans.Commit()
} catch (Exception) {
trans.Rollback()
}