Jag*_*uar 6 c# asp.net nhibernate transactions
您好我正在使用asp.net Web应用程序的每个请求事务(视图会话)模式.我在应用程序中有几个要点,我想保存一个NHibernate管理实体,然后使用常见的SQL执行几个插入和更新.这些插入/更新取决于NH保存实体将采用的ID.
问题是生成的id在事务范围内不存在.如果我强制刷新/提交id是持久的,但如果插入/更新失败,我必须回滚,但刷新/提交的实体不会.目前我正在为这些案例进行手动插入,但这是我想要改变的.那么,有没有办法在Save()之后执行SQL语句(在已打开的事务中)但不强制刷新/提交?
编辑:我正在添加一个半伪代码示例,我有4个错误的答案所以我认为人们不理解(NHibernate如何工作)在开始请求我发出一个
nhsession.BeginTransaction()
Run Code Online (Sandbox Code Playgroud)
然后在某些时候我做
FooClass fc = new FooClass("value");
nhsession.Save(fc);
ITransaction trans = nhsession.Transaction;
SqlCommand sc = new SqlCommand("some insert/update query that depends on fc's id", (SqlConnection)nhsession.Connection);
sc.Parameters.Add("id", fc.Id); //NHibernate generates the id, note i'm using assigned/hi-lo so no round trip to the db takes place
transaction.Enlist(sc);
try {
sc.ExecuteNonQuery();
}
catch (SqlException ex){
transaction.RollBack();
nhsession.Close();
}
Run Code Online (Sandbox Code Playgroud)
在请求结束时我发出一个CommitTransaction()和nhsession.Close()
现在这绝对不会做任何事情:FooClass (fc)尚未刷新/提交到数据库.在Save()该NH所做的操作是高达内存这一点.这意味着nhibernate没有发出sql命令,这意味着SqlCommand (sc)我之后触发的那个命令将失败,因为id不存在.
如果我做了冲洗/间提交Save()与SqlCommand该FooClass(fc)_cannot_be_rolled_back_,这是一个坏人坏事.目前,为了这个工作我使用一个vanila sql插入SqlCommand,我想改变它.(为什么?因为我不想制作香草插页,因为架构/模型更改而容易出错,我得到了OR/M)
怎么样?我想以某种方式通知NHibernate执行SqlCommandto对应的Save()插入(地狱,它可以执行它已经收集的所有SqlCommands)但没有它提交或刷新!
目前我还在搜索nhibernate在刷新/提交保存的对象时产生的准备好的sql语句.也许我可以只接受该字符串并在我在事务中登记的SqlCommand中运行它.
也许我不明白,但你不能这样做......
using(var tx = session.BeginTransaction())
{
session.Save(entity);
session.Flush();
//perform non NH operations with entity.id
tx.Commit();
}//uncommitted transaction would be rolled back on dispose()
Run Code Online (Sandbox Code Playgroud)