nHibernate:回滚完成操作失败

nHibernate:回滚完成操作失败,nhibernate,transactions,fluent-nhibernate,Nhibernate,Transactions,Fluent Nhibernate,我们在两个表之间分割了一个userobject,一个person表和一个user表 public UserMap() { Table("Person"); Id(x => x.PersonId, "PersonId"); Map(x => x.Name, "Name"); Join("User", s => { s.Fetch.Join(); s.KeyColumn("PersonId"); s.Map(x =&g

我们在两个表之间分割了一个userobject,一个person表和一个user表

public UserMap() 
{
   Table("Person");
   Id(x => x.PersonId, "PersonId");
   Map(x => x.Name, "Name");

   Join("User", s => {
      s.Fetch.Join();
      s.KeyColumn("PersonId");
      s.Map(x => x.Username, "Username");
      s.Map(x => x.Password, "Password");
   });
}
在执行插入时,nHibernate将首先将
Name
插入
Person
表,然后将
Username
Password
插入
User

当插入到
用户
-表失败时(例如尝试插入已使用用户名的用户),就会出现问题。事务失败,但不会回滚插入到
Person
表中的操作。

    public User Save(User user)
    {
        var session = SessionHelper.GetCurrent();
        using (var dbTransaction = session.BeginTransaction())
        {
            try
            {
                session.SaveOrUpdate(user);
                dbTransaction.Commit();
            }
            catch (Exception)
            {

                dbTransaction.Rollback();
                throw;
            }                
        }

        return user;
    }
我们的SessionFactory也与Fluent NHibernate建立了联系

    public ISessionFactory BuildSessionFactory(string connectionString)
    {
        return Fluently.Configure().Database(OracleClientConfiguration.Oracle10.ConnectionString(c => c.Is(connectionString))
                                             .Provider<OracleDriverConnectionProvider>()
                                             .Driver<OracleDataClientDriver>()
                                             .ShowSql)
                                             .Mappings(m => m.FluentMappings.AddFromAssemblyOf<UserMap>())
                                             .BuildSessionFactory();
    }
public ISessionFactory BuildSessionFactory(字符串连接字符串)
{
流畅地返回.Configure().Database(OracleClientConfiguration.Oracle10.ConnectionString(c=>c.Is(ConnectionString))
.Provider()
.司机()
.ShowSql)
.Mappings(m=>m.FluentMappings.AddFromAssemblyOf())
.BuildSessionFactory();
}

我已将失败会话中的日志文件放入。
用户
实体在现实生活中稍微复杂一些,并且有一些身份验证工作正在进行,因此日志文件希望与绘制的图片1:1匹配…

似乎解决了类似的问题。当您回滚事务时,NHibernate不会还原会话中的更改,即如果在回滚后刷新会话,您将遇到您描述的问题。为确保实体中没有更改,回滚时,还必须关闭会话。

在Person对象中添加用户对象,并仅保存Person对象。在映射文件中使用Cascade.All()。或者第二个选项是使用TransactionScope。

在回滚事务后,可以使用session.Clear()而不是关闭会话,这将删除所有挂起的写入操作,并使会话与新会话一样。
这就是我申请的诀窍。

从被接受的答案来看,这个问题看起来确实是一个复制品,有更好的答案。是相关的(和更新的)。-1。你没有清洁保证。如所述:“如果回滚事务,则应立即关闭并放弃当前会话,以确保NHibernate的内部状态一致。”。使用任何与文档相矛盾的技巧都会导致意外故障。