我是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);
}
}
答案 0 :(得分:2)
建议将每个呼叫(单个或多个呼叫)包装在交易中。当多线程/多进程环境中其他线程/进程更改了您正在读取的数据时,这有助于生成可靠的结果。 通话还包括阅读通话。
之所以建议这样做的其他原因是因为现代RDBMS总是将每个调用包装在事务中(如果尚未完成的话)。它的成本。如果程序员已经知道工作单元,那么更好的是,可以节省成本,并且电话可以更好地分组。
但是,根据情况,可能不需要进行任何(创建,读取,更新,删除)调用。根据具体情况决定。如果您由于“代码看起来丑陋”的原因而避免这样做,请考虑实施UoW。
顺便说一句,希望您不要为每个电话都拨BuildSessionFactory
。这是昂贵的,更重要的是不需要。而是在应用程序启动时调用它。
回复评论:
我的意思与“奥斯卡·伯格格伦”在评论中提到的相同;它只是不够明确。由于问题更多是关于交易的问题,而UoW不仅仅是交易,所以我宁愿只“提及” UoW,也不愿讨论细节。
关于第一段,“多个呼叫”可以包含在单个工作单元中。请理解,UoW比事务more多。使用NHibernate这样的ORM,使用UoW可以更好地利用事务。还要注意,对于完整的ORM,您无需执行太多操作即可实现UoW。 ISession
本身就是UoW。您只需要适当地对其使用范围进行管理即可。
以下答案可能对您有所帮助:
https://stackoverflow.com/a/51781877/5779732
https://stackoverflow.com/a/50721461/5779732