次のエンティティ クラスを想定します。
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; }
}
Player の次のマッピング クラスを想定します。
<?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>
そして、次の Player リポジトリ メソッドを想定します。
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 のエピソードで EF 4.0 について話したとき、Julia Lerman は、多くの人がこの種の状況で外部キーを使用したいと考えていることを認めました。
編集: この回答は、私の質問の本質を示しています。
Id のみを保持し、必要に応じて残りをロードするオブジェクトを持つようなものだと考えてください。リレーションシップ (FK など) を作成するために単に渡すだけの場合は、id だけで十分です。
- では、なぜプロキシ オブジェクトなどについて心配する必要があるのでしょうか。「ダミー」オブジェクトを作成して外部キー値を指定することが本当に重要なのであれば、なぜできないのでしょうか?