c# - NHibernate Linq Provider 渴望获取惰性字符串属性

标签 c# nhibernate lazy-loading eager-loading

我被认为是 NHibernate 的新手。我希望我的 Article 实体类具有两个惰性属性。其中之一是用户,另一个是内容。我的实体和映射就像

<class name="Article" table="TBL_ARTICLE">
    <id name="Id" column="ART_ID">
        <generator class="native" />
    </id>
    <property name="UserId" column="USR_ID" not-null="true" />
    <many-to-one name="User" column="USR_ID" insert="false" update="false" />
    <property name="Content" column="ART_CONTENT" not-null="true" lazy="true" />
</class>

public class Article
{
    public virtual long Id { get; set; }
    public virtual long UserId { get; set; }
    public virtual User User { get; set; }
    public virtual string Content { get; set; }
}

我喜欢它

using(ISession session = sessionFactory.OpenSession()) {
     return session.Query<Article>()
                   .SingleOrDefault(a => a.Id == id);
}

它工作正常。当我尝试访问 using block 之外的 User 或 Content 属性时,我遇到了某种延迟加载异常。这是我所期望的。

在某些情况下,我喜欢急切地获取用户数据。我这样选择它:

using(ISession session = sessionFactory.OpenSession()) {
     return session.Query<Article>()
                   .Fetch(a => a.User)
                   .SingleOrDefault(a => a.Id == id);
}

它仍然可以正常工作。当我尝试访问 using block 之外的 User 属性时,我可以获得其属性值,但是当尝试访问 Content 属性时,我仍然遇到某种延迟加载异常,这仍然是我所期望的。

当我想像这样获取内容数据时

using(ISession session = sessionFactory.OpenSession()) {
     return session.Query<Article>()
                   .Fetch(a => a.Content)
                   .SingleOrDefault(a => a.Id == id);
}

我得到一个异常(exception):

Invalid join: a.Content
[.SingleOrDefault[Repository.NH.Article](.Fetch[Repository.NH.Article,System.String]
(NHibernate.Linq.NhQueryable`1[Repository.NH.Article], Quote((a, ) => (a.Content)), ),
Quote((a, ) => (Equal(a.Id, 1))), )]

我阅读了一些关于通过 HQL 执行此操作的博客文章,但我正在寻找使用 Linq Provider 的解决方案。

最佳答案

Fetch 构造仅适用于映射对象之间关系的属性,因此使用“引用”、“多对一”或“多对多”映射的属性。

这就是为什么它可以按预期使用 User 属性而不是字符串 Content 属性。

经过进一步调查,我认为您无法使用 LINQ 语法实现您想要的结果,但应该可以使用等效的 HQL 语句使用 fetch all properties 提示:

session.CreateQuery("from Article fetch all properties")

关于c# - NHibernate Linq Provider 渴望获取惰性字符串属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16919670/

相关文章:

NHibernate 使用复合键将两个表连接成一个实体

c# - 用于有状态应用程序的 ORM。 EF适合吗?或者任何?

vue.js - 来自 ElementUI 的 VueJs + Webpack 延迟加载模块

nhibernate - session.Close() 和 session.Dispose() 之间的区别

c# - 使用反射从静态类内部的静态类中获取所有字段

c# - 这个指令是什么意思?

c# - 如何在不将该颜色应用于每个子控件的情况下更改 GroupBox 的 ForeColor?

java - 如何在 Hibernate 中对延迟加载的集合使用二级缓存?

javascript - 延迟加载图像加载页面上的所有图像

c# - 我如何从 asp.net 页面运行任何 win.exe?