用Fluent NHibernate加载完整对象
本文关键字:对象 加载 Fluent NHibernate | 更新日期: 2023-09-27 18:23:54
如何使用Fluent NHibernate加载完整的对象(其中包含所有关联的对象)?在这种情况下,对象名为Project,并具有关联的"类别"answers"图片"列表。映射文件如下所示:
public ProjectMap()
{
Id(x => x.Id);
Map(x => x.Title).Not.Nullable();
Map(x => x.Year);
Map(x => x.Slug).Not.Nullable();
Map(x => x.Description).CustomSqlType("nvarchar(MAX)").Not.Nullable();
References(x => x.Category, "CategoryId").Not.Nullable();
HasMany(x => x.Gallery)
.Inverse()
.Cascade.All();
}
以及应该返回完整对象的存储库方法:
public Project Read(int id)
{
using (var session = NHibernateHelper.OpenSession())
{
var project = session.CreateQuery("FROM Project WHERE Id = :Id LEFT JOIN FETCH p.Category LEFT JOIN FETCH p.Gallery")
.SetParameter("Id", id).UniqueResult<Project>();
return project;
}
}
我假设默认情况下您希望延迟加载,但有时您希望在必要时进行紧急加载。如果你总是想急切地加载(不推荐),你应该在映射中使用not.Lazylod,并使用.fetch().选择一个获取策略
否则,您将不得不使用NHibernate中的一个查询方法来执行您想要的操作。您可以使用HQL查询或Linq查询,也可以使用Criteria查询。
这是一个LINQ查询(这在3.2中有效,不确定在此之前是否可用)
session.Linq<Project>()
.Fetch(p => p.Category)
.FetchMany(p => p.Gallery).FirstOrDefault();
这是HQL版本的
session.CreateQuery("SELECT p FROM Project p FETCH JOIN p.Category FETCH JOIN p.Gallery")
.UniqueResult<Project>();
这是标准版
session.CreateCriteria<Project>("p")
.SetFetchMode("p.Category", FetchMode.Join)
.SetFetchMode("p.Gallery", FetchMode.Join)
.UniqueResult<Project>();