gpt4 book ai didi

c# - 使用 Fluent NHibernate 加载完整对象

转载 作者:行者123 更新时间:2023-11-30 22:31:29 24 4
gpt4 key购买 nike

如何使用 Fluent NHibernate 加载完整对象(其中包含所有关联对象)?在这种情况下,该对象被命名为 Project 并具有关联的类别和图片列表。映射文件如下所示:

        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.Lazyload 来执行此操作,并使用 .Fetch() 选择获取策略。

否则,您将不得不使用 NHibernate 中的一种查询方法来执行您想要的操作。您可以使用 HQL 查询或 Linq 查询以及可能使用条件查询来执行此操作。

这是一个 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>();

关于c# - 使用 Fluent NHibernate 加载完整对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9202890/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com