c# - NHibernate 手动控制抓取

标签 c# nhibernate fluent-nhibernate fetch

我正在使用 NHibernate,我想控制手动获取相关实体。

这是我的示例实体

public class Post
{
    public virtual long Id { get; set; }
    public virtual string Title { get; set; }
    public virtual User User { get; set; }
    public virtual IList<Like> Likes { get; set; }
    public virtual IList<Tag> Tags { get; set; }
}

我期望的行为如下:

session.Query<Post>().ToList();

在这种查询之后,我希望 Post 实体具有:

  1. 基本属性已设置
  2. User 属性不为空,但只设置了 Id 属性。
  3. LikesTags 为 null 或空集合

-

session.Query<Post>()
    .Fetch(p => p.User)
    .Fetch(p => p.Tags)
    .ToList();

在这种查询之后,我希望 Post 实体具有:

  1. 基本属性已设置
  2. User 属性不为 null 并且属性已设置。
  3. Tags 不为 null 并且所有项目都设置了所有属性
  4. Likes 为 null 或空集合

基本上我想从 NHibernate 得到的是,不获取任何相关实体,除非我要求它获取并且在我尝试访问未获取的属性时不会导致 NHibernate 特定异常(LazyInitialization 等)。我期望的行为既不懒惰也不急切。

在“你试过什么”评论之前,我在 Fluent 中尝试了几乎所有与 LazyLoad()NotFetch 等的组合NHibernate 映射配置以及无状态和有状态 session 。

最佳答案

我无法弄清楚如何在调用引用之前不进行验证的情况下处理未初始化的实例:

NHibernateUtil.IsInitialized(entityOrCollection)

和/或

NHibernateUtil.IsPropertyInitialized(obj, "propertyName")

关于c# - NHibernate 手动控制抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29826248/

相关文章:

c# - 从 C# 调用非托管代码 - 返回带有数组的结构

c# - 是否可以在自己的应用程序中使用 Windows 7 任务调度程序

c# - 如何找到正在运行的进程的窗口句柄?

c# - View 异常后的 Nhibernate Lazy Load 异常

fluent-nhibernate - 流畅的 NHibernate API 和 .NET 2.0

c# - 在请求之间创建一个托管在 IIS7 中的 WCF 服务吗?

nhibernate - Fluent nhibernate 映射嵌套属性 "cannot find getter"

c# - NHibernate session.Query<ISomeInterface>().Count 返回错误的计数

php - 什么 PHP ORM 最像 NHibernate?

vb.net - 删除 NHibernate 表中的所有行