To be honest, a static Queue<IDbCommand> sounds like a problem waiting to happen. How do you handle aborted transactions and how to you ensure that only commands belonging to a specific transaction are executed?
2015-12-04 21:06 GMT+01:00 Maximilian Haru Raditya <[email protected]>: > Would session.Flush() between session.Save() and > session.Connection.CreateCommand() work out for you? > On Dec 4, 2015 2:56 AM, "Felipe Oriani" <[email protected]> wrote: > >> Hello guys, I have a problem using NHibernate, but first let me explain >> the scenario. >> >> We have a web application which allows the user to manage fields over the >> entities. For sample, we have a City table with fixed columns (Id, Name and >> State), then user can define new columns on the entity (city) by a >> configuration scren we have developed. This configuration screen runs some >> sql statements to manage the fields (Alter Table to create an drop columns >> on the tables) which we call as "flex field". >> >> However, these flex fields are no mapped by nhibernate, so, we need to >> manage the information on these fields manually by sql statement. The code >> bellow shows how we do it in a scenario when we are creating a new entity >> (city): >> >> // start a transaction from asp.net mvc attribute (ActionExecuting) >> var transaction = session.BeginTransaction(); >> >> // save a new entity on the data layer >> session.Save(city); >> >> // get a IDbCommand instance to manage the flex fields >> var cmd = session.Connection.CreateCommand(); >> >> // define the sql update to update the flex fields passing the id of >> the entity >> cmd.CommandText = "update city set flex1=@flex1, flex2=@flex2 where id >> = @id"; >> >> // define all the parameters on the cmd here... >> >> // add the command on the nhibernate transaction object >> transaction.EnList(cmd); >> >> // execute the command >> cmd.ExecuteNonQuery(); >> >> // commit the transaction on the asp.net mvc attribute >> (ActionExecuted) >> transaction.Commit(); >> >> When we run this code, everything executes without any error. If we are >> updating a existent entity (City) the flex fields are updated fine, but the >> problem is when we are inserting a new entity (City), the update statement >> executed by command is not being executed, and we get all the flex field >> with null values. >> >> I supose when we are inserting, the command is been performed before the >> insert (on commit). Is there any way to force the commands on EnList >> Transaction be executed after all others statements, but on the same >> transaction? >> >> Thank you. >> >> >> >> >> -- >> ______________________________________ >> Felipe B Oriani >> [email protected] >> >> -- >> You received this message because you are subscribed to the Google Groups >> "nhusers" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at http://groups.google.com/group/nhusers. >> For more options, visit https://groups.google.com/d/optout. >> > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/nhusers. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/nhusers. For more options, visit https://groups.google.com/d/optout.
