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”将其存储到数据库中。现在正在开会
  • 保存后仍然可以更改对象
  • 提交更改。最新状态将存储到数据库中
如果使用分离的实体,还需要Update或SaveOrUpdate将分离的实体放入会话


当然,您可以将NH配置为不同的行为。但如果您遵循此默认行为,效果会更好。

我不确定是否理解您的问题,但以下是我的想法:

考虑“将对象放入会话”而不是“获取和存储数据”。NH将在会话中存储所有新的和更改的对象,而无需对其进行任何特殊调用

考虑以下情况:

数据更改:

  • 使用任何查询从数据库获取数据。实体现在处于NH会话中
  • 仅通过更改特性值来更改实体
  • 提交事务。更改将刷新并存储到数据库中
创建新对象:

  • 调用构造函数以创建新对象
  • 通过调用“Save”将其存储到数据库中。现在正在开会
  • 保存后仍然可以更改对象
  • 提交更改。最新状态将存储到数据库中
如果使用分离的实体,还需要Update或SaveOrUpdate将分离的实体放入会话


当然,您可以将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();
    }
}
因此,通过这种方式,要么整个操作成功,要么失败并回滚,将刷新/事务管理保持在存储库之外