2

我有一段代码将元素添加到实体集合(一对多关系)。这是带有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);
        }

那个版本对我不起作用。正如我用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();
        }

现在它可以工作了。package.Themes集合中的元素存储在数据库中。怎么来的?谢谢!

4

1 回答 1

7

比较苹果和橘子!

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

情况 1 中发生的情况很可能永远不会触发刷新操作。在情况 2 中,该项目可能由于集合上的级联而被保存,而事务提交会触发刷新。

于 2012-05-30T13:36:54.077 回答