Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate:在事务中多次更新数据库_C#_Fluent Nhibernate - Fatal编程技术网

C# NHibernate:在事务中多次更新数据库

C# NHibernate:在事务中多次更新数据库,c#,fluent-nhibernate,C#,Fluent Nhibernate,下面是我目前拥有的一个简化代码。 我注意到,当点1/2抛出异常时,状态保持为0,而不是1或2。 我最初认为更新可以做到这一点,但似乎我必须调用Commit才能在数据库中进行更改。 对我来说,有什么好方法可以做到这一点? 返回/异常时以DB显示1和2的状态。 非常感谢您的帮助 using(var tx = session.BeginTransaction()) { Monitor monitor = monitorDao.Get(id); if (someStatus)

下面是我目前拥有的一个简化代码。 我注意到,当点1/2抛出异常时,状态保持为0,而不是1或2。 我最初认为更新可以做到这一点,但似乎我必须调用Commit才能在数据库中进行更改。 对我来说,有什么好方法可以做到这一点? 返回/异常时以DB显示1和2的状态。 非常感谢您的帮助

using(var tx = session.BeginTransaction()) 
{
    Monitor monitor = monitorDao.Get(id);
    if (someStatus)
    {
        monitor.status = 1;    // initially monitor.status == 0 in DB
        // Point 1: some codes that might return or throw exception
    }
    else
    {
        monitor.status = 2;
        // Point 2: some codes that might return or throw exception
    }

    monitor.status = 3;
    tx.Commit();    
}

此设置由ISession上的FlushMode控制。您应该搜索此主题,例如,此链接提供了有关FlushMode选项的更多详细信息:

从不:更改从不自动刷新,您必须调用 ISession.Flush显式

提交:更改将在 当前ITransaction已提交,无需调用Flush

汽车:汽车 如果请求查询某些实体类型和类型,则刷新会话 存在脏的本地实体实例,无需调用Flush;这 是默认值

始终:在执行任何查询之前刷新会话 已执行,也无需调用Flush


似乎您必须重构代码以获得所需的行为:

Monitor monitor = monitorDao.Get(id);
if (someStatus)
{
    using(var tx = session.BeginTransaction()) 
    {
        monitor.status = 1;    // initially monitor.status == 0 in DB
        tx.Commit();
    }
    // Point 1: some codes that might return or throw exception
}
else
{
    using(var tx = session.BeginTransaction()) 
    {
        monitor.status = 2;    // initially monitor.status == 0 in DB
        tx.Commit();
    }
    // Point 2: some codes that might return or throw exception
}

 using(var tx = session.BeginTransaction()) 
 {
      monitor.status = 3;
      tx.Commit();
 }

出现异常时,第一次状态更新从未发送到数据库。通过给它一个单独的事务,您首先通过提交来更新数据库。然后你做你可能失败的逻辑。如果您在第1/2点执行任何操作,如保存到db,以及状态为3的事务中必须包含的内容。然后,您需要重构代码,使逻辑位于第二个事务中

nhibernate维护加载对象的缓存。所有更新都在缓存上完成。当会话被快速刷新、事务被提交或会话被释放时,更改被提交。因此,我确实需要每个状态更新的单独事务。。谢谢:谢谢你提供关于FlushMode的信息!我不认为我会将其更改为“始终”,但很高兴知道这样的选项存在。