問題タブ [mapping-by-code]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
3545 参照

c# - NHibernateを使用した単純な取得(コードによるマッピングを使用)は非常に遅い

だから私はこれがとても遅い理由についてのアイデアを使い果たしました。多分あなたは助けることができます。そのため、コードによるnHibernateマッピングを使用して、Oracleデータベースから単純なレコードの取得を実行しようとしています。nugetのnHibernateverison3.3.1.4を使用しています。

マッピングコードは次のとおりです。

これは、sessionfactoryを作成してデータを取得するためのコードです。

生成されるクエリは次のとおりです。

取得したオブジェクトにアクセスするには、平均で約80〜100秒かかります。これには、セッションの作成も含まれます。

だから私が探したいくつかの明白なもの:

  • personId列にインデックスが付けられます(これはテーブルの主キーです)。
  • データベースはサーバー上にあるため、時間を浪費しているネットワークではないことを確認するために、AD0.Net(Oracleconnection + Oraclecommand)を使用して上記の生成されたクエリを実行しました。これには約180ミリ秒かかります。これには、接続の作成とレコードのエンティティクラスへのマッピングが含まれます。
  • PL / SQL開発者を介してクエリを実行しました(約32ミリ秒かかりました)。
  • 生成されたクエリのクエリプランを確認します(全表スキャンではなく、インデックスの一意のスキャンの使用を確認しました)。
  • 私はローカルで同様のサイズのsql2012dbに対して上記のコードを実行しましたが、NHibernateコードを介して約180ミリ秒という非常に高速な比較です。
  • nhprof(評価)を実行し、次の結果を取得しました。

NHibernateプロファイラーの結果

クエリが実行され、結果がデータベースから非常に高速に返されるように見えますが(nhprofの結果によると)、時間がかかっているエンティティへのクエリの値のハイドレーションである可能性があります。私は時間をかみ砕くことができるものに途方に暮れています!

私の次の動きは、nHibernateソースをソリューションにアタッチしてステップスルーすることですが、職場でのダウンロードアクセスは制限されています(githubにさえ!)。それまで何かアイデアはありますか?

乾杯。

更新:プロジェクトにnHibernateソースがあり、それをステップスルーしました。プログラムがこのコードに到達するまで、すべてが順調に進んでいます。

実行が時間を浪費するのはその上rs.Read()です。ここで、rsはoracleデータリーダーです。このコードはDoQuery、Loader.csファイルの関数に含まれています。

奇妙なことに、渡されたクエリがパラメータ化されていない動的クエリ(eg select ... from person where personid = '1')の場合、実行は高速(〜1ms)になりますが、パラメータ化された(eg select ... from person where personid = :p1)の場合、途方もなく遅くなります。nHibernateのパワーを利用したいので、生成されたパラメーター化されたクエリを使用する必要があります。私はまだオラクルリーダーがなぜかを理解しようとしています

0 投票する
0 に答える
431 参照

nhibernate - nHibernate はフィルタリングされたバッグを単一のプロパティにマップします

エティティを DB のマスター テーブルにマップする必要があります。

このエンティティには、別のエンティティとの OneToMany があります。

マスター エンティティの Collection を Child テーブルのすべての行にマップする必要があります。

しかし、子テーブルから取得した単一の行でプロパティをマップし、常に 1 つの行のみを返す条件でフィルター処理する必要もあります。

コンポーネントのようなものですが、フィルタリングされた子テーブルにあります。

これは私のマッピングです:

DynamicComponent について何かを見つけましたが、それが自分のためかどうかわかりません...

http://notherdev.blogspot.it/2012/01/mapping-by-code-dynamic-component.html

ありがとうございました!!

0 投票する
2 に答える
201 参照

nhibernate - nhibernate の発効日

2 つの既存のテーブル(User: UserId, Name)(Location: LocationId, Name)の間に多対多の関係がありますが、これらは変更できません。多対多のマッピングを使用しましたが、履歴/将来の動きを含めるという新しい要件があります。

最初の 3 つのフィールドが主キーを構成する古いテーブルを置き換える新しい交差テーブル(UserLocation: UserId、LocationId、EffectiveDate、Status)のレコードを効果的にデートするという peoplesoft の概念を使用しました。

SQL では、次のステートメントを使用して、特定の発効日のアクティブなレコードを返すことができますが、NHibernate からこのようなものを取得することはできません (複数レベルの選択でパラメーターが機能していないというエラーが表示されることさえあります)。

UserId 列と EffectiveDate 列のパラメーターを含めて、さらにフィルター処理されたレコードを返す必要がありますが、最初からすべてを返すことができれば幸いです。

ただし、私の問題はマッピングクラスであり(流暢ではなくコードマッピングを使用しています)、動作に近づけることさえできません(NHibernateの知識が限られています)。交差テーブル用の新しいクラスを作成する必要がないことを望んでいました。選択を機能させることさえできないため、挿入/更新/削除の部分にまだ到達していません。

要件: 1. ユーザーをEffectiveDate = NOW、Status = Trueの場所に関連付けるときは、UserLocationに新しいレコードを挿入します。 3. ユーザーを新しい場所に移動すると、EffectiveDate = NOW、Status = TrueのUserLocationに新しいレコードを挿入する必要があります。ロケーションのユーザーは、EffectiveDate = NOW、Status = False の新しい UserLocation レコードを挿入します。 5. ユーザーが特定の日付に関連付けられているロケーションを取得します。

注: このデータに基づいてレポートが生成されるため、記録を削除することはできません。また、将来のイベントのためにデータも作成されます。

誰かが私を正しい方向に向けて始めることができれば、それはありがたいです. Loader クラスと Interceptor クラスを見てきましたが、適合しないようです。

0 投票する
1 に答える
1682 参照

nhibernate - プロパティリファレンスとのコード多対多関係によるNHibernate 3.3.1マッピング

私はかなり大きなデータベースを持っており、NHibernate 3.3.1 byCode マッピングを使用して 2 つのエンティティをマッピングする必要があります (FluentNHibernate ではなく組み込みマッピングを使用していることを考慮してください)。

エンティティは、主キーではなく、一意のキーを介して多対多の関係にあります。

これが私の例です

したがって、Uniqueidentifierプロパティを介して3番目のテーブルAchievableKittingsを使用して、AchievableテーブルをKittingにリンクする必要があります

次のマッピング クラスを作成しました。

NHibernate は k.PropertyRef(x => x.Uniqueidentifier) ステートメントを無視するようです。私の主キーは、ID によって生成された bigint です。Nhiebrnate がデータベースを作成しようとすると、AchievableKittings の FK キーを達成可能の primaryKey に作成しますが、property-ref Uniqueidentifier には作成しません。

もちろん、例外がスローされます。

FluentNhibernate を使用すると、これを正しい方法でマッピングできました。残念ながら、現在のプロジェクトでは FluentNhibernate を使用できません。

それで、誰かがこの問題で私を助けることができますか?

0 投票する
1 に答える
1222 参照

nhibernate - コードによる双方向の NHibernate マッピング

明確にするために、この質問は Fluent NHibernate に関するものではありません。

私はParentandChildクラスを持っており、それらの間には一対多の関係があります。

コードは読みやすくするために短縮されています。

Childクラスにはプロパティが必要ですParent。はParent関係を制御する必要があります (の最後Inverseに totrueを設定することはできませんParent)。

ParentとのChildマッピングはどのようになりますか?

0 投票する
1 に答える
187 参照

nhibernate - ComponentMapping を統合する方法適合マッピングとは?

私は適合マッピングを使用して新しいプロジェクトを開始しています。次のように、コンポーネント マッピングに引き出された共通のフィールド セットがあります。

ただし、私のクラス マッピングでは、これらのいずれかを受け入れる Component メソッドのオーバーロードはないようで、魔法のようにピックアップされません。このマッピングを使用するにはどうすればよいですか?

0 投票する
1 に答える
268 参照

nhibernate - Nhibernate ByCode マッピング -- null の多対 1 オブジェクト マップを回避するには?

レガシー データベースをマッピングしていますが、以前はユーザーがサインアップして後で国を追加するときに国を選択する必要はありませんでした。

そのため、NULL の CountryID を持つユーザーがいます。そのため、多対 1 マッピング (ByCode) が対応する国の詳細を読み込もうとすると、何も見つからないため、ユーザーの「国」オブジェクトは null になります。

たとえば、user.Country.Name を表示しようとすると、オブジェクト参照が見つかりません。

Undisclosed と呼ばれる ID が -1 の国を作成し、null の国 ID をすべて -1 に変更することでこれをハッキングできますが、それは一般的な問題を解決するための不正行為です。

私の質問は、CountryID が見つからない場合にそのユーザーが新しい Country オブジェクトを取得するようにマップするにはどうすればよいかということです。

ユーザーオブジェクトでの私のマッピングは次のとおりです。

私の CountryMap はかなり基本的なものです...

0 投票する
1 に答える
1555 参照

nhibernate - NHibernate 複合要素のコードによるマッピング

「NHibernate in Action」の例を翻訳して、コードで NHibernate マッピングを学習しようとしていますが、例の 1 つに問題があります。翻訳しようとしている XML と、それを翻訳するための努力を含めました。このコードは基本的に、カテゴリとアイテムの間に多対多の関係を持っています。これは、CategorizedItem という名前のコンポーネント クラスを使用して、2 つのエンティティ間の関係を維持します。

私が抱えている問題は、ラムダでカテゴリの項目プロパティを宣言すると、項目クラスのプロパティだけがコンポーネント マッピングで選択できることです。CategorizedItem のプロパティが関係でマップされるものであることをマッピングに知らせたいのですが、これがどのように達成されるかについて途方に暮れています。以下は、翻訳しようとしている XML です...

...そして、これが私が部分的に行ったマッピングです。

コンポーネントのクラス プロパティはターゲットの可能性が高いように見えますが、タイプ パラメーターとして CategorizedItem を拒否しています。どんな助けでも大歓迎です。

0 投票する
1 に答える
847 参照

nhibernate - コードによる NHibernate マッピング: レガシーの非 int ID キーをエンティティの int プロパティにマッピングすると、「型を特定できませんでした」という例外が発生します

テーブルの主キー値に VARCHAR(8) として格納されたゼロで埋められた数値を使用する従来のデータベースがあります。(例:「00032982」)

これらを文字列ではなく、エンティティ オブジェクトの Int32 プロパティにマップしたいと考えています。

私の最初の試みは、IUserType を実装するクラスを作成することでした。しかし、私はプロパティではなくIDをマッピングしていて、コードによるマッピングはコンパイルされません:(多分私はその部分を正しくやっていませんか?)

IIdentifierType を調べたところ、40 を超えるメンバーが含まれています。私はあちこちを見回しましたが、NHibernate.Type.ImmutableType をサブクラス化するカスタム型を作成することが解決策になるように思えました。(……もしかして、これが最初のミス?)

そこで、 Set() メソッドでゼロを埋め込む ImmutableType に基づいて新しいクラスを作成しました。

基本エンティティ クラスでは、Int32 として定義しています。

それから私はそれをマッピングしようとしました:

次に、この例外が発生します...おそらく何か他のことを示していると感じています。スタック トレースは次のとおりです。

前もって感謝します!

0 投票する
2 に答える
1186 参照

c# - NHibernate - ID を一時的にオフにする

SQL CE を使用して NHIbernate ソリューションを実行しています。以下のように、テーブル内のフィールドを 1 つマッピングしています。ただし、一部のデータ インポートを実行するには、ID を一時的にオフにして既存のキーを使用してデータをインポートし、インポートが完了したら ID をオンに戻す必要があります。

次のように、ソリューションから直接 SQL クエリを実行してみました。

しかし、これは効果がないようです。

これを一時的にオンまたはオフにする方法はありますか?