首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

问个NHibernate方面的有关问题 忘解答

2012-05-22 
问个NHibernate方面的问题 忘解答问题是:最近有个项目ORM用的是NHibernate,开始到没有遇到什么大问题,但是

问个NHibernate方面的问题 忘解答
问题是:最近有个项目ORM用的是NHibernate,开始到没有遇到什么大问题,但是现在遇到了事务方面的问题。
我在数据的增、删、减、更新里面都使用了事务。
基本代码如下:

C# code
#region 插入一条Channel信息    public int SaveChannelInfo(EPGChannelInfo channelInfo)    {        int channelID = 0;        using (ITransaction tx = _isession.BeginTransaction())        {            try            {                channelID=_isession.Save(channelInfo);                tx.Commit();                return channelID;            }            catch (HibernateException)            {                tx.Rollback();                tx.Dispose();                throw;            }        }    }#endregion

现在的情况是:在Nuint里面测试方法成功执行。跟踪得到的SQL如下:
SQL code
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;BEGIN TRANSACTIONexec sp_executesql N'INSERT INTO TABLE .........(此处SQL省略)COMMIT TRANSACTION

但是我在Web上调用却失败了,跟踪得到的SQL如下:
SQL code
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;BEGIN TRANSACTIONexec sp_executesql N'INSERT INTO TABLE .........(此处SQL省略)IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION

发现事务竟然回滚了,闷。

有人可以帮忙解答下这个问题吗?
再一个就是 我代码没有对ISession进行很好的管控,我怀疑是这个问题导致的,如果是这个问题,有人可以提供解决方案吗?

[解决办法]
既然用的是using (ITransaction tx = _isession.BeginTransaction())
它会自动释放的 finally中的 tx.Dispose();可以不要
当然也许是因为你的_isession.Save(channelInfo)这个方法有异常
[解决办法]
1、给出的信息太少了,没办法判断
2、using 的那个地方应该是ISession 对象,不应该是事务。
3、最好封装为单例模式。
[解决办法]
可能的原因是nunit使用的数据是“好的”,而web提交的“坏的”,比如违反了数据库不能为 null 的约束之类的

using 里 try catch 完全不必要,可以去掉

热点排行