Fluent nHibernate - 不延迟加载

Posted

技术标签:

【中文标题】Fluent nHibernate - 不延迟加载【英文标题】:Fluent nHibernate - not Lazy Loading 【发布时间】:2013-12-10 21:32:17 【问题描述】:

这可能有点傻,但我可以理解它。我有三张桌子

Post
id
content
...
User 
id
name
...
Vote
user_id
post_id
votedate

我的投票地图:

public class VoteMap : ClassMap<Vote>

    public VoteMap()
    
        DynamicUpdate();

        Table("vote");            
        Id(Reveal.Member<Vote>("_id")).Column("id");
        Map(Reveal.Member<Vote>("_votedate")).Column("vote_date");

        References(x => x.Post).Column("post_id").LazyLoad().Not.Nullable();
        References(x => x.User).Column("user_id").LazyLoad().Not.Nullable();
    

邮政地图:

public class PostMap : ClassMap<Post>

    public PostMap()
    
        DynamicUpdate();

        Table("post");
        Id(Reveal.Member<Post>("_id")).Column("id");
        Map(Reveal.Member<Post>("_content")).Column("content");
        References(x => x.User).Column("user_id").Not.Nullable().LazyLoad();
    

用户地图

public class UserMap : ClassMap<User>

    public UserMap()
    
        DynamicUpdate();

        Table("user");
        Id(Reveal.Member<User>("_id")).Column("id");
        Map(Reveal.Member<User>("_name")).Column("name");

        HasMany(x => x.Posts).KeyColumn("user_id").LazyLoad();
        HasMany(x => x.Votes).KeyColumn("user_id").LazyLoad();
    

当我检索投票时:

var myvote = _votesRepository.GetVote(postid, userid);
int post_id = myvote.Post.Id;
int user_id = myvote.User.Id;

投票属性设置正确。 PostUser 引用属于 Castle.Proxies.PostProxyCastle.Proxies.UserProxy 类型,它们的属性是空的。 (post_iduser_id 设置为 0)

nHibernate 不应该延迟加载这些数据吗?

【问题讨论】:

出于好奇,您为什么将私有字段 ("_id") 映射为 Id,而不是 Id 属性?虽然我真的不熟悉私有字段映射,但我想知道它是否适合延迟加载,特别是对于标识符。你试过用属性映射替换这些吗? 因为我所有的实体都具有只读属性(不允许实体处于无效状态)。我按照建议用公共虚拟属性替换了私有属性,但仍然得到相同的结果。只有当我显然将 .Not.LazyLoad() 添加到所有映射时,它才有效。 拥有实体类的相关代码将有助于理解您的问题。 【参考方案1】:

你是对的 jbl,它根本不喜欢私有 id 字段。此更改解决了问题:

protected int _id;
public virtual int Id  get return _id; 

并从此更改所有类的映射:

Id(Reveal.Member<Vote>("_id")).Column("id");

到这里:

Id(x => x.Id).Column("id");

【讨论】:

以上是关于Fluent nHibernate - 不延迟加载的主要内容,如果未能解决你的问题,请参考以下文章

nhibernate 可以在没有代理的情况下进行延迟加载吗?

NHibernate + Fluent NHibernate 异常

NHibernate 2 + Fluent Nhibernate 中等信任

Fluent NHibernate 主键约束命名约定

Fluent NHibernate Composite Id 长度设置不正确

使用 2 种策略通过 fluent nhibernate 映射类层次结构