4

次のエンティティ クラスを想定します。

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 だけで十分です。

  • では、なぜプロキシ オブジェクトなどについて心配する必要があるのでしょうか。「ダミー」オブジェクトを作成して外部キー値を指定することが本当に重要なのであれば、なぜできないのでしょうか?
4

2 に答える 2

4

あなたはそのように外部キーを使用します...

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

ロードと取得の違いを理解する

于 2010-01-28T21:25:11.153 に答える
3

この時点でセッションにアクセスできる場合は、呼び出すことができます

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

Load の前提は、必要に応じて自己解決できる NHibernate プロキシを作成することです。もちろん、ID が存在することを確認する必要があります。そうしないと、それ自体を解決しようとすると EntityNotFound エラーが発生します。

于 2010-01-28T21:28:38.580 に答える