我有一段代码可以将元素添加到实体集合(一对多关系)。这是带有 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 集合中的元素存储在数据库中。怎么会?谢谢!
请您参考如下方法:
比较苹果和橘子!
- Save() 将告诉 NHibernate “这个对象应该持久化”。 INSERT 语句发出的确切时间未定义,可能会在一段时间后发生。
- 根据级联设置,可能不需要 Save()。
- 您应该始终使用交易。
- 默认情况下将脏状态刷新到实际数据库发生在事务提交和查询时,如果脏状态可能会影响查询的结果。
情况 1 中发生的情况很可能永远不会触发刷新操作。在情况 2 中,项目可能由于集合上的级联而被保存,而事务提交触发刷新。




