2010-01-28 60 views
4

假定以下實體類:NHibernate:多對一 - *必須*您加載父對象?

public class Player 
{ 
public virtual int ID { get; set; } 
public virtual string Name { get; set; } 
public virtual Team Team { get; set; } 
} 

public class Team 
{ 
public virtual int ID { get; set; } 
public virtual string City { get; set; } 
public virtual string Nickname { get; set; } 
} 

承擔播放器下面的映射類:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false"> 
<class name="Player"> 
    <id name="ID" column="ID" type="System.Int32" unsaved-value="null"> 
    <generator class="native"/> 
    </id> 
    <property name="Name" column="Name" not-null="true" type="System.String" length="50" insert="true" update="true"/> 
    <many-to-one name="Team" not-null="true" outer-join="auto" insert="true" update="true"> 
    <column name="TeamID"/> 
    </many-to-one> 
</class> 
</hibernate-mapping> 

,並承擔以下球員庫方法:

public void Add(Player player) 
{ 
using (ISession session = NHibernateHelper.OpenSession()) 
{ 
    using (ITransaction transaction = session.BeginTransaction()) 
    { 
    session.Save(player); 
    transaction.Commit(); 
    } 
} 
} 

我的問題:

當我想創建一個新玩家時,我必須加載一個完整的團隊(父對象)嗎?
或者我可以指定一個「模擬」對象,並只指定外鍵?

Player player = new Player 
       { 
       Name = "Tom Brady", 
       Team = new TeamRepository().GetTeamByCityAndNickname("New England", "Patriots") // Is this the only way? 
       // or can I do this? 
       // Team = new Team { ID = 22 } 
       }; 
new PlayerRepository().Add(player); 

  • 如果我不能指定一個「模擬」 對象(僅指定 外鍵),可以請你解釋 我爲什麼不能?
  • 也就是說,你可以給我一個關於發生了什麼的想法嗎?

單挑:


  • 有趣的是,在DotNetRocks episode談論EF 4.0的時候,朱莉婭·勒曼 承認,很多人想 使用這些類型的 情況外鍵。

編輯:This answer點,我的問題的實質。

你可以把它就像一個對象,只有 保持Id和如果你需要的是會加載 休息。如果你只是通過 創建關係(如FKs), 就是你所需要的。

  • 那麼,如果是這樣的話,那麼爲什麼我需要擔心的代理對象等?爲什麼我不能創建一個「虛擬」對象並指定外鍵值,如果這真的很重要?
+0

在我知道負載之前,我使用了所謂的虛擬對象。它確實有效......但不建議。所以你想知道爲什麼不建議?這是個好問題。 – dotjoe 2010-01-28 21:49:25

+0

@dotjoe:聽起來像我們在同一陣營。 :) //完全可以這麼說,我從來沒有收到過正式的'NHibernate最佳實踐'教育(可能大部分,如果不是我們所有人都屬於這個陣營)。但無論如何,我想稍微打開一下這個黑匣子,並瞭解推薦的最佳做法背後的原因。 – 2010-01-28 21:54:00

+0

哈哈,我也沒有...我剛從NHibernate網站上跟着那個重擊初學者的示例項目。然後,我開始檢查SO的問題並關注Ayende的博客。 – dotjoe 2010-01-28 22:05:10

回答

3

如果此時訪問會話您可以撥打

Team = Session.Load<Team>(id); 

負荷的前提是,它會創建,如果能夠自行解決的NHibernate的代理需要。當然,你必須確定id存在,否則如果它嘗試自行解析,你將會得到一個EntityNotFound錯誤。

4

你使用外鍵像這樣...

Team = session.Load<Team>(id); 

知道difference between load and get

+0

是的 - 我知道這是約定,但我想知道這是否是唯一的方式;如果是這樣,我想知道爲什麼。 – 2010-01-28 21:27:56

+2

我回答了一個問題,在這之前http://stackoverflow.com/questions/1765165/nhibernate-update-reference/1765464#1765464。唯一的另一種選擇是擺弄ID,這違背了NHibernate的最佳實踐,暗示Id應該是隻讀的。 – 2010-01-28 21:30:20

+0

@Michael Gattuso:謝謝你的加入。 – 2010-01-28 21:38:19

相關問題