nHibernate:回滚完成操作失败
我们在两个表之间分割了一个userobject,一个person表和一个user表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
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的内部状态一致。”。使用任何与文档相矛盾的技巧都会导致意外故障。