2013-11-25 177 views
2

這可能是愚蠢的東西,但我可以讓我的頭靠近它。我有三個表流利的nHibernate - 不是懶惰加載

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

我VoteMap:

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

中userMap

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.PostProxyCastle.Proxies.UserProxy和他們的屬性是空的。 (POST_IDuser_id說明被設置爲0)

不應該的nHibernate延遲加載該數據?

+1

出於好奇,爲什麼你映射了私有字段(''_id「')爲Id,而不是'Id'屬性?雖然我真的不熟悉私有域映射,但我不知道它是否適合延遲加載,特別是對於標識符。你有沒有嘗試用屬性映射替換這些? – jbl

+0

因爲我所有的實體都具有隻讀屬性(不允許實體處於無效狀態)。按照建議,我用公共虛擬屬性替換了私有屬性,但仍得到相同的結果。它只適用於當我顯然添加.Not.LazyLoad()到所有映射。 –

+0

具有您的實體類的相關代碼將有助於理解您的問題。 – jbl

回答

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");