Collections NHibernate HiLo不';无法在集合中的对象上生成ID

Collections NHibernate HiLo不';无法在集合中的对象上生成ID,collections,fluent-nhibernate,hilo,Collections,Fluent Nhibernate,Hilo,我使用的是NHibernate和HiLo策略,我的问题是集合中对象的ID不是在Session.Save()上生成的(仅在Transaction.Commit()上)。 例如: imagegalleryimagegallery=imageGalleryRepository.GetById(imgGalleryId); imageGallery.Images.Add(新图像()); imageGalleryRepository.Save(imageGallery);//在这里,我需要访问Images

我使用的是NHibernate和HiLo策略,我的问题是集合中对象的ID不是在Session.Save()上生成的(仅在Transaction.Commit()上)。 例如:

imagegalleryimagegallery=imageGalleryRepository.GetById(imgGalleryId);
imageGallery.Images.Add(新图像());
imageGalleryRepository.Save(imageGallery);//在这里,我需要访问Images集合中新图像的ID属性,但在我提交事务之前它是0。能做到吗?
以下是我的代码:

公共抽象类实体
{
公共虚拟整数Id{get;set;}
}
公共类ImageGallery:实体
{
公共虚拟IList映像{get;set;}
// ...
}
公共类映像:实体
{
公共字符串文件名{get;set;}
公共图像库图像库{get;set;}
// ...
}
映射:

公共类ImageGalleryMap:ClassMap
{
公共图像GalleryMap()
{
Id(x=>x.Id).GeneratedBy.HiLo(“hibernate_unique_key”,“next_hi_image_gallery”,“10”);
有许多(x=>x.Images)。
Cascade.All()。
KeyColumn(“GalleryId”)。
逆()。
Fetch.Join();
}
}
公共类GalleryImage映射:类映射
{
公共GalleryImageMap()
{
Id(x=>x.Id).GeneratedBy.HiLo(“hibernate_unique_key”,“next_hi_image”,“10”);
映射(x=>x.FileName);
参考文献(x=>x.ImageGallery).列(“GalleryId”);
}
}

Session.Save不一定刷新对数据库的更改。会话是包含数据库更改的工作单元。它不一定立即将更改发布到数据库。请看一下如何使用Session.Flush()。有关更详细的说明,请阅读以下内容:

编辑:

当您拥有双向关系时,您还希望从代码的角度维护这种关系。所以你需要这样做:

ImageGallery imageGallery = imageGalleryRepository.GetById(imgGalleryId);
Image newImage = new Image();
newImage.ImageGallery = imageGallery;
imageGallery.Images.Add(newImage);

imageGalleryRepository.Save(imageGallery);
通常,我在实体中使用Add/Remove方法来执行此操作,而不是在上面的代码中显式执行此操作


如果此答案或此处的任何其他答案对您有帮助,请单击将其标记为答案的复选标记。

在刷新并转到数据库之前,不会对现有对象进行级联更改。如果希望有一个新对象(映像)与会话关联,则需要通过在会话上调用save并传递新对象,将其添加到会话本身。当您有一个要添加到会话中的新库对象时,它会遍历对象图并添加引用的子对象


另外(不是很重要,但只是要指出),您不需要为已经从使用getbyid的会话中获得的库本身调用save。它已经存在于会话中,对它的任何更改都将在会话刷新时保留。保存实际上更像是向会话添加内容的操作。它不在乎你是否尝试添加一些已经存在的东西,它只是没有真正做任何事情。

就是这样,我还不想去DB,我想在DB之前得到那个ID(因此是HiLo)。我在EndRequestt上提交事务,但在此之前我需要该新ID。您没有向NHibernate提供自己的IDbConnection,是吗?不,我只使用web.config
FluentConfiguration FluentConfiguration=fluent.configuration().Database中的连接字符串(FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2008.ConnectionString(c=>c.FromConnectionString WithKey(“MyConnectionString”))
我知道,如果我将尚未持久化的图像添加到库中并调用会话,将生成库和图像的Save(gallery)id(无刷新或提交!),但如果我从DB获取gallery并在其中添加图像,则session.Save之后该图像的ID=0。为什么?????我看到的一件事是,您没有从代码中维护双向关系。请查看我在上面的编辑中的示例。