2

我有一個以下的數據庫方案設置,我不能真正改變。流利的NHibernate映射:一對一(或沒有)

User 
---- 
Id (primary key) 
[Some simple properties...] 


UserAdditionalData 
------------------ 
Id  (primary key) 
[Some simple properties...] 
USERID (foreign key to User) 

很明顯的是,User表並沒有真正有它是否鏈接到UserAdditionalData記錄的任何記憶,所以我不認爲我可以在這裏稱這是一個真正的一個一對一映射因爲他們也不會分享互斥的PK。

但是,實際上,我希望能夠在User對象上工作,例如檢查它是否有UserAdditionalData記錄,如果是,請訪問其屬性。

我建立了我的BDO這樣:

public class User 
{ 
    [Some simple properties...] 
    public virtual UserAdditionalData UserAdditionalData { get; set; } 
} 

public class UserAdditionalData 
{ 
    [Some simple properties...] 
    public virtual User User { get; set; } /* I have this here, 
               but I don't really ever 
               have to access it in this 
               direction */ 
} 

我建立了我的映射,例如:

public UserMapping() 
    { 
     Table("USER"); 
     [Some simple properties...] 
     HasOne(x => x.UserAdditionalData).Cascade.None(); 
    } 


    public UserExtraMapping() 
    { 
     Table("USER_ADDITIONAL_DATA"); 
     [Some simple properties...] 
     References(x => x.User, "USERID").Unique(); 
    } 

這一切編譯,但是我看到我的UserExtra對象(當通過User對象訪問時)始終爲空。 我已經嘗試了很多不同的方式去了解它,閱讀了很多關於實現這個作爲一對多。但是,我仍然無法使其工作。

任何幫助將非常感激。

謝謝!

[小UPDATE]:我只需要查詢數據庫,而不是保存到它,如果這是相關的任何方式。

+0

'HasOne'和'References'設置你爲我工作。SQL NHibernate生成的外觀是否正確? – 2014-09-01 20:34:29

回答

1

根據您的小更新,我會去一個簡化的映射。我們將從NHibernate真正的映射能力中受益,並優化用戶負載。所有這一切,因爲我們確實需要只讀映射。

首先,我們應當在附加類介紹簡單int屬性UserId現在

// extra class is having an int property containig the foreign key 
public class UserAdditionalData 
{ 
    public virtual int UserId { get; set; } 
} 

// that would be the mapping: 
public UserExtraMapping() 
{ 
    ... 
    Map(x => x.UserId, "USERID"); 
} 

,我們會在比較使用良好優化映射遲緩裝載many-to-one(Ie隨一到其中一個加載兩端始終,這裏我們將只有在真正需要時才能獲得參考數據!)

public UserMapping() 
{ 
    ... 
    References(x => x.UserAdditionalData) 
      .LazyLoad() 
      .PropertyRef(e => e.UserId) 
      .Not.Insert() 
      .Not.Update() 
      ; 
} 

因此,對於只讀我會做最好使用many-to-one映射(References()

還看到: