私はショートカットを探しています。私は、多対多の関係を持ついくつかの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_Id
とCategory_Id
)を持つ別のテーブルを介して実行されます。
データベースから完全なエンティティを取得することなく、Category
をCustomer
に追加できます。
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からあまりにも多くのことを聞いていますか?
残念ながら、私のセッションはASP.NET MVCアプリケーションに直接公開されていません。別のライブラリのリポジトリを呼び出す必要があります。私はViewModelマッパーがリポジトリ層に直接話さなければならないことを望んでいました。その周りには何か? –
さて、自分自身を修正しよう - 私は通常、MVCアプリケーションからセッションにアクセスしません。 –