假定以下實體類: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);
- 如果我不能指定一個「模擬」 對象(僅指定 外鍵),可以請你解釋 我爲什麼不能?
- 也就是說,你可以給我一個關於發生了什麼的想法嗎?
單挑:
- 一個傢伙有着nearly the same question。
- Here's the answer that made the most sense。
- 有趣的是,在DotNetRocks episode談論EF 4.0的時候,朱莉婭·勒曼 承認,很多人想 使用這些類型的 情況外鍵。
編輯:This answer點,我的問題的實質。
你可以把它就像一個對象,只有 保持Id和如果你需要的是會加載 休息。如果你只是通過 創建關係(如FKs), 就是你所需要的。
- 那麼,如果是這樣的話,那麼爲什麼我需要擔心的代理對象等?爲什麼我不能創建一個「虛擬」對象並指定外鍵值,如果這真的很重要?
在我知道負載之前,我使用了所謂的虛擬對象。它確實有效......但不建議。所以你想知道爲什麼不建議?這是個好問題。 – dotjoe 2010-01-28 21:49:25
@dotjoe:聽起來像我們在同一陣營。 :) //完全可以這麼說,我從來沒有收到過正式的'NHibernate最佳實踐'教育(可能大部分,如果不是我們所有人都屬於這個陣營)。但無論如何,我想稍微打開一下這個黑匣子,並瞭解推薦的最佳做法背後的原因。 – 2010-01-28 21:54:00
哈哈,我也沒有...我剛從NHibernate網站上跟着那個重擊初學者的示例項目。然後,我開始檢查SO的問題並關注Ayende的博客。 – dotjoe 2010-01-28 22:05:10