流利的nHibernate - 不是延迟加载

时间:2013-11-25 22:59:32

标签: c# nhibernate fluent-nhibernate mapping lazy-loading

这可能是愚蠢的事情,但我可以理解它。我有三张桌子

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();
    }
}

PostMap:

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;

投票属性设置正确。 发布用户引用的类型为 Castle.Proxies.PostProxy Castle.Proxies.UserProxy ,其属性为空。 ( post_id user_id 设置为0)

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

1 个答案:

答案 0 :(得分:0)

你是对的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");