2011-10-09 3 views
4

私はショートカットを探しています。私は、多対多の関係を持ついくつかのNHエンティティを持っています。このような何か:NHibernate:idによって多対多コレクションにエンティティを追加する

public class Customer : EntityBase<Customer> 
{ 
    public virtual IList<Category> Categories { get; set; } 
} 

public class Category : EntityBase<Category> 
{ 
    public virtual IList<Customer> Customers { get; set; } 
} 

これは非常に単純な描写であるので、私は、多対多の配置を使用するか、私はそのような値型か何かを使用する必要があることではない提案する誘惑に抵抗を覚えておいてください。

DB側では、この関係は2つの列(Customer_IdCategory_Id)を持つ別のテーブルを介して実行されます。

データベースから完全なエンティティを取得することなく、CategoryCustomerに追加できます。

customerEntity.Categories.Add(new Category { Id = 2 }); 

この理由は、アプリケーションがASP.NET MVCアプリケーションであり、ビュー用にViewModelsを使用しているためです。これらのCustomer ViewModelsはカテゴリ選択のためにList<int>になります。そのViewModelを対応するCustomerエンティティにマップすると、データベースにアクセスすることなくそのカテゴリIDをCategoriesリストに吸い上げることができますそれらを最初に検索します。

私がこれを行うことができる理由の1つは、データベース呼び出しを最小限に抑えることですが、マッパークラスでCustomerエンティティを作成することもできます私のサービス層は他のオブジェクトを求めて行く...それは悪いデザインのようだ。また、マッパーを呼び出すために別のレイヤーを追加する必要がなく、リポジトリ(ドメインサービスレイヤーを介してアクセスされる)からエンティティを取得するその他のマッピング作業を行う必要もありません。

idbagをチェックアウトしましたが、1つはFluent NHibernateを使用していますが、それはそのコンストラクトをサポートしていません。また、2つのドキュメントから私がList<int>をエンティティに渡すことができますそれらのコレクション内の完全なエンティティにアクセスできるようにしたいと考えています。

NHibernateからあまりにも多くのことを聞いていますか?

答えて

3

使用ISession.Load

customerEntity.Categories.Add(session.Load<Category>(2)); 

負荷がプロキシを返し、データベースにヒットしません。プロキシのIDプロパティはデータベースにアクセスすることなくアクセスできますが、他のプロパティにアクセスすると、NHibernateはプロキシをロードします。

+0

残念ながら、私のセッションはASP.NET MVCアプリケーションに直接公開されていません。別のライブラリのリポジトリを呼び出す必要があります。私はViewModelマッパーがリポジトリ層に直接話さなければならないことを望んでいました。その周りには何か? –

+0

さて、自分自身を修正しよう - 私は通常、MVCアプリケーションからセッションにアクセスしません。 –

関連する問題