11

他のテクノロジー( CSLASubsonic )を数年間使用した後、NHibernateを使用するようになりました。特に、Subsonicと比較した場合、クエリは少しイライラします。私は人々が他にどのようなアプローチを使用しているのか疑問に思いましたか?

Hibernateクエリ言語は私には正しく感じられません。SQLを書くのとあまりにも似ているようです。これはORMツールを使用する理由の1つであるため、使用する必要はありません。さらに、すべてXMLであるため、リファクタリングには不十分で、エラーは実行時にのみ検出されますか?

基準クエリ、十分に流動的ではないようです。

Ayendeの NHibernateQueryGeneratorは便利なツールだと読みましたが、これは人々が使用しているものですか他に何がありますか?

編集:読む価値があります http://www.ayende.com/Blog/archive/2007/03/17/Implementing-Linq-for-NHibernate-A-How-To-Guide--Part.aspx

4

5 に答える 5

5

LINQforNHibernateの機能はまだベータ版です。NHibernate 2.1を楽しみにしています。そこでは、最終的にカットされると言われています。

約1か月前にNHibernateのLINQについてプレゼンテーションを行いましたが、お役に立てば幸いです。スライドやコードを含め、ここでブログを書きました。

LINQ for NHibernate:VisualStudio2008のスライドとコードでのO/Rマッピング

于 2008-09-04T09:32:59.950 に答える
3

XML を取り除くには、Fluent NHibernateを試してください。

Linq2NH はまだ完全には焼き上がっていません。コア チームは、NH Contrib の実装とは異なる実装に取り​​組んでいます。ただし、単純なクエリでは問題なく機能します。最良の結果を得るために、使用する場合でも控えめに使用してください。

クエリの方法 (hql と Criteria と Linq2NH)については、リポジトリ インターフェイスで意図を明らかにするメソッド ( GetProductsForOrder(Order order)、など) を公開し、それらを最適な方法で実装します。GetCustomersThatPurchasedProduct(Product product)単純なクエリは hql の方が簡単かもしれませんが、仕様パターンを使用すると、Criteria API の方が適している場合があります。そのようなものはリポジトリにカプセル化されたままであり、テストに合格した場合、実装方法はそれほど重要ではありません。

Criteria API は扱いにくく制限があるものの、柔軟であることがわかりました。HQL はより私のスタイルであり (SQL よりも優れています。オブジェクト ベースであり、スキーマ ベースではありません)、単純な GetX メソッドの場合、私にとってはよりうまく機能するようです..

于 2008-09-07T03:21:07.647 に答える
1

LINQ-to-NHibernateおよびAyendeのNHQGの代わりに、C#3式からNHibernate式/制限を生成することもできます。このようにして、より強く型付けされたCriteriaAPIを取得します。

見る:

于 2008-12-01T23:24:28.347 に答える
1

デフォルトでは、Hibernate に Linq を使用しています。バグや制限にぶつかると、HQL に切り替えます。

リポジトリなどのデータ アクセス クラスにすべてのクエリをまとめると、クリーンなアプローチになります。

public class CustomerRepostitory()
{ 
  //LINQ for NHibernate     
  public Customer[] FindCustomerByEmail(string email)
  {
     return (from c in _session.Linq<Customer>() where c.Email == email).FirstOrDefault();
  }

  //HQL
  public Customer[] FindBestBuyers()
  {
    var q = _session.CreateQuery("...insert complex HQL here...");
    return q.List<Customer>();
  }
}

あなたはリファクタリングについて尋ねました。LINQ は明らかに IDE によって処理されるため、残りの HQL については、これらのリポジトリ クラスをスキャンして手動で HQL を変更するのはかなり簡単です。

HQL を XML ファイルに入れることは良い習慣です。おそらく、ReSharper NHIbernate プラグインがクエリのリファクタリングを処理できるかどうかを確認してください。

クエリ (HQL または LINQ) を作成またはリファクタリングする際の大きな改善点は、ファインダー メソッドを単体テストの下に置くことです。このようにして、緑色のバーが表示されるまで HQL/LINQ をすばやく調整できます。コンパイル/テスト/フィードバック ループは非常に高速です。特に、テストにインメモリ データベースを使用する場合は顕著です。

また、リファクタリング後に HQL を編集するのを忘れた場合、単体テストによって壊れた HQL がすぐに通知されます。

于 2008-10-15T20:16:17.387 に答える
-1

可能であれば、nHibernate を破棄して Subsonic に戻ります。私の意見では、Subsonic ははるかに流暢でテスト可能な ORM/DAL です。私は絶対に HQL が嫌いです。ORM で弱く型付けされたクエリのポイントは何ですか? また、Linq to SQL を使用してレイヤーを切り取ることができるのに、なぜ Linq/nH/SQL を使用するのでしょうか?

nHibernate は、Subsonic が存在していなかった頃は優れた ORM でしたが、現在では、それに比べて作業が非常に困難です。nHibernate と Subsonic を比較すると、簡単に 2 倍の時間がかかります。nHibernate は実行時であるため、テストは面倒です。そのため、コンパイル時エラーが発生するのではなく、サイトを「クリック」するために数人の QA エンジニアを雇う必要があります。

于 2009-02-04T19:54:01.307 に答える