NHibernate中的ISession.Save/Update和ITransaction.Commit之间的区别

dra*_*fly 2 nhibernate hibernate

我有一段代码,可以向实体集合添加元素(一对多关系).这是ISession.Save的版本

        using (ISession session = sessionFactory.OpenSession())
        {
            var package = session.QueryOver<Package>().Where(x => x.ID == selectedPackage).SingleOrDefault();
            foreach(var themeId in selectedThemes)
            {
                var selectedTheme = session.QueryOver<HBTheme>().Where(x => x.ID == themeId).SingleOrDefault();
                if (selectedTheme != null)
                {
                    package.Themes.Add(new PackageTheme() { Package = package, Theme = selectedTheme });
                }
            }
            session.Save(package);
        }
Run Code Online (Sandbox Code Playgroud)

那个版本对我不起作用.正如我用ITransaction编写的测试一样,我将其改为以下内容:

        using (ISession session = sessionFactory.OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
            var package = session.QueryOver<Package>().Where(x => x.ID == selectedPackage).SingleOrDefault();
            foreach(var themeId in selectedThemes)
            {
                var selectedTheme = session.QueryOver<HBTheme>().Where(x => x.ID == themeId).SingleOrDefault();
                if (selectedTheme != null)
                {
                    package.Themes.Add(new PackageTheme() { Package = package, Theme = selectedTheme });
                }
            }
            transaction.Commit();
        }
Run Code Online (Sandbox Code Playgroud)

现在它的工作原理.package.Themes集合中的元素存储在数据库中.怎么会?谢谢!

Osk*_*ren 7

比较苹果和橘子!

  1. Save()会告诉NHibernate"这个对象应该是持久的".确切地说,何时发出INSERT语句未定义,并且可能在一段时间后发生.
  2. 根据级联设置,可能不需要Save().
  3. 您应该始终使用交易.
  4. 默认情况下,在事务提交和查询时,如果脏状态可能会影响查询结果,则将脏状态刷新到实际数据库.

在案例1中发生的情况很可能是从未触发刷新操作.在案例2中,项目可能由于集合上的级联而被保存,而事务提交会触发刷新.