NHibernate中的冲洗
这个问题有点傻,但我还是不明白处理脸红的最佳方法 我正在迁移一个现有的代码库,其中包含大量如下代码:NHibernate中的冲洗,nhibernate,Nhibernate,这个问题有点傻,但我还是不明白处理脸红的最佳方法 我正在迁移一个现有的代码库,其中包含大量如下代码: private void btnSave_Click() { SaveForm(); ReloadList(); } private void SaveForm() { var foo = FooRepository.Get(_editingFooId); foo.Name = txtName.Text; FooRepository.Save(f
private void btnSave_Click()
{
SaveForm();
ReloadList();
}
private void SaveForm()
{
var foo = FooRepository.Get(_editingFooId);
foo.Name = txtName.Text;
FooRepository.Save(foo);
}
private void ReloadList()
{
fooRepeater.DataSource = FooRepository.LoadAll();
fooRepeater.DataBind();
}
现在,我将FooRepository更改为Nhibernate,我应该为FooRepository.Save方法使用什么?保存实体时,FooRepository是否应始终刷新会话?我不确定是否理解您的问题,但以下是我的想法: 考虑“将对象放入会话”而不是“获取和存储数据”。NH将在会话中存储所有新的和更改的对象,而无需对其进行任何特殊调用 考虑以下情况: 数据更改:
- 使用任何查询从数据库获取数据。实体现在处于NH会话中
- 仅通过更改特性值来更改实体
- 提交事务。更改将刷新并存储到数据库中
- 调用构造函数以创建新对象
- 通过调用“Save”将其存储到数据库中。现在正在开会
- 保存后仍然可以更改对象
- 提交更改。最新状态将存储到数据库中
当然,您可以将NH配置为不同的行为。但如果您遵循此默认行为,效果会更好。我不确定是否理解您的问题,但以下是我的想法: 考虑“将对象放入会话”而不是“获取和存储数据”。NH将在会话中存储所有新的和更改的对象,而无需对其进行任何特殊调用 考虑以下情况: 数据更改:
- 使用任何查询从数据库获取数据。实体现在处于NH会话中
- 仅通过更改特性值来更改实体
- 提交事务。更改将刷新并存储到数据库中
- 调用构造函数以创建新对象
- 通过调用“Save”将其存储到数据库中。现在正在开会
- 保存后仍然可以更改对象
- 提交更改。最新状态将存储到数据库中
当然,您可以将NH配置为不同的行为。但如果您遵循此默认行为,则效果最佳。在修改一个Foo实体和从存储库加载所有Foo之间是否显式刷新会话并不重要。如果您在会话中进行了可能会影响您尝试运行的查询结果的更改,那么NHibernate足够聪明,可以自动刷新自身
理想情况下,我会尝试在每个“工作单元”中使用一个会话。这意味着一个有凝聚力的工作可能涉及几个较小的步骤。如果您觉得您的体系结构中没有可以实现这一点的接缝,那么在存储库中管理会话也可以。请注意,您错过了NHibernate为您提供的一些功能。在修改Foo实体和从存储库加载所有Foo之间是否显式刷新会话并不重要。如果您在会话中进行了可能会影响您尝试运行的查询结果的更改,那么NHibernate足够聪明,可以自动刷新自身
理想情况下,我会尝试在每个“工作单元”中使用一个会话。这意味着一个有凝聚力的工作可能涉及几个较小的步骤。如果您觉得您的体系结构中没有可以实现这一点的接缝,那么在存储库中管理会话也可以。请注意,您错过了NHibernate为您提供的一些功能。如果可以的话,我会投票支持Stefan Moser的答案-我自己仍在努力学习Nh,但我认为能够编写这样的代码很好:
private void SaveForm()
{
using (var unitofwork = UnitOfWork.Start())
{
var foo = FooRepository.Get(_editingFooId);
var bar = BarRepository.Get(_barId);
foo.Name = txtName.Text;
bar.SomeOtherProperty = txtBlah.Text;
FooRepository.Save(foo);
BarRepository.Save(bar);
UnitOfWork.CommitChanges();
}
}
因此,通过这种方式,要么整个操作成功,要么失败,然后回滚,将刷新/事务管理保持在存储库之外。如果可以,我会投票支持Stefan Moser的答案-我自己仍在努力解决Nh问题,但我认为能够编写这样的代码很好:
private void SaveForm()
{
using (var unitofwork = UnitOfWork.Start())
{
var foo = FooRepository.Get(_editingFooId);
var bar = BarRepository.Get(_barId);
foo.Name = txtName.Text;
bar.SomeOtherProperty = txtBlah.Text;
FooRepository.Save(foo);
BarRepository.Save(bar);
UnitOfWork.CommitChanges();
}
}
因此,通过这种方式,要么整个操作成功,要么失败并回滚,将刷新/事务管理保持在存储库之外