用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;
        }
    }

用Fluent NHibernate加载完整对象

我假设默认情况下您希望延迟加载,但有时您希望在必要时进行紧急加载。如果你总是想急切地加载(不推荐),你应该在映射中使用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>();