我有一段代码可以将元素添加到实体集合(一对多关系)。这是带有 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 集合中的元素存储在数据库中。怎么会?谢谢!

请您参考如下方法:

比较苹果和橘子!

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

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!