5

以前は L2S を使用していましたが、プロジェクトでシャープ アーキテクチャと共に NHib を使用することを検討しています。私はプロトタイピングを開始しましたが、グーグルで検索する方法がわからない最初の問題に遭遇しました。

いくつかの単純なプロパティと 1 つの参照プロパティ (カテゴリ - ここには示されていないクラス) を持つ POCO が与えられた場合:

public class Post
{
  public Post()
  {
    this.DateCreated = DateTime.Now;
  }

  public virtual string Title {get;set;}
  public virtual DateCreated {get;set;}
  public virtual Category {get;set;}
}

これは、投稿の概要を表形式で作成したい場合に便利です。「Category」という名前の列が必要で、カテゴリのタイトルを表示したい場合は、単に Post.Category.Title を使用できます。

ただし、ユーザーは新しい投稿を作成します (ドロップダウン リストなどからカテゴリを選択します)。送信をクリックすると、Post オブジェクトが新しく作成されます。ただし、新しい投稿を永続化する前に、Category プロパティに割り当てるために、Category のインスタンスを (ID で) 取得する必要がありますか?

両方の長所を活かすには?Post POCO を更新して Category を int にすると、新しいインスタンスの作成が簡単になりました。しかし、ID を指定してカテゴリ名を解決する必要がある一部のレンダリング コードでは難しいでしょうか?

ここで基本的な概念が欠けていると思いますか?

Post テーブルに CategoryId という名前の整数の外部キー列があるスキーマが与えられた場合、Linq to Sql を使用すると、基になるテーブル列 (CategoryId) と、外部キー行を含む EntitySet の両方が生成されます。

NHibernateで同様のことを達成するにはどうすればよいですか? これは一般的にどのように管理されていますか?

ありがとう

4

2 に答える 2

4

関連するエンティティは、エンティティとしてマッピングする必要があります。たとえばCategory、ではありませんint CategoryId

新しいインスタンスを作成するときにPost、実際のCategoryインスタンスがない場合(そして、リストからカテゴリを選択している場合は、すでにそれらをロードしています)、そのIDしか持っていない場合は、Load()を使用できます。実際にデータベースにアクセスすることなく、指定されたIDの永続的なCategoryインスタンスを取得するメソッド:

post.Category = (Category) sesssion.Load(typeof(Category), categoryId);

汎用バージョンを使用することもできます。

post.Category = session.Load<Category>(categoryId);
于 2009-11-19T00:23:10.737 に答える
1

NHibernateでは、参照プロパティを使用します。

流暢なマッピングを使用すると、次のようになります。

mapping.References(x => x.Category, "CategoryId").PropertyRef(x=>x.Id).Cascade.All();

XMLでは、大まかに

<many-to-one name="Category" column="category_id" class="YourNamespace.Category" cascade="all" property-ref="Id" />

not-foundを使用して、関連付けられたカテゴリがない場合の動作を選択できます。

基本的に、IDではなくカテゴリオブジェクトのセマンティクスが必要なので、NHibernateにそれらがどのように関連付けられているかを伝えるだけです。

于 2009-11-19T00:23:38.583 に答える