我是 NHibernate 的新手……我应该.BeginTransaction()为了得到项目吗?没有它,代码会抛出,但是它看起来很难看,因为没有tx.Commit()/.CommitAsync()显式调用。我假设结束IDisposable会做吗? public override async Task<TDto> Get(int id) { using (var sessionBuilder = NHibernateConfiguration.Instance.BuildSessionFactory()) using (var session = sessionBuilder.OpenSession()) using (var tx = session.BeginTransaction()) { return await session.GetAsync<TDto>(id); } }
1 回答

守候你守候我
TA贡献1802条经验 获得超10个赞
它建议包裹在交易的每个呼叫(单个或多个呼叫)。当其他线程/进程更改您正在读取的数据时,这有助于在多线程/多进程环境中生成可靠的结果。该调用还包括读取调用。
推荐它的其他原因是因为现代 RDBMS 总是将每个调用都包装在事务中(如果尚未完成)。它的成本。如果程序员已经知道工作单元,那就更好了,可以节省成本,并且可以更好地对调用进行分组。
但是,根据场景,可能不需要任何(创建、读取、更新、删除)调用。这是根据具体情况决定的。如果由于“代码看起来很丑”的原因而避免这样做,请考虑实施 UoW。
顺便说一句,我希望你不是BuildSessionFactory每次都打电话。这是昂贵的,更重要的是,不需要。而是在您的应用程序启动时调用它。
回应评论:
我的意思与“Oskar Berggren”的评论中提到的相同;它只是不够明确。由于问题更多的是关于交易,而 UoW 不仅仅是交易,我更愿意只是“提及”UoW 而不是详细说明。
关于第一段,“多个调用”可以包含在单个工作单元中。请您理解,UOW是多比交易。使用像 NHibernate 这样的 ORM,使用 UoW 可以更好地利用事务。另请注意,使用完整的 ORM,您无需为实现 UoW 做太多事情。ISession本身就是UoW。您只需要正确地使用范围-使用-管理它。
- 1 回答
- 0 关注
- 115 浏览
添加回答
举报
0/150
提交
取消