問題タブ [nhibernate-mapping]
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.
nhibernate - ストアドプロシージャを使用せずにNHibernateで非正規化された更新が可能ですか?
ある程度計画された非正規化(DBAによって計画された)を備えたデータベースを持つプロジェクトでNHibernateを使用することを考えています。1セットのテーブルから読み取り、1つの列を1つのプロパティにマッピングすることは問題ではありません。ただし、更新するときは、1つのプロパティを元のテーブルの元の列にマップし直し、さらに非正規化されたテーブルのその列のコピーをいくつか更新する必要があります。ストアドプロシージャを使用せずにNHibernateでこれを行うことは可能ですか?
編集:私はNXCの答えに同意する傾向がありますが、この質問は、データベースで問題を解決するのではなく、NHibernateの問題を解決する方法についてです。
nhibernate - Hibernate の次/前の兄弟マッピング
nHibernate を使用して、.NET の System.Web.SiteMapNode に非常によく似たオブジェクトをマップしています。オブジェクトをこの .NET オブジェクトに似たものにするために、ParentNode、PreviousSibling、NextSibling、および ChildNodes の複合プロパティを含めたいと考えています。
表は次のように見えますが、変更可能です。
- ID (整数)
- タイトル(文字列)
- 説明 (文字列)
- キー (文字列)
- ParentNodeId (整数)
- OrdinalPosition (整数)
- 読み取り専用 (ブール値)
- URL (文字列)
.NET SiteMapNode オブジェクト (isExternal bool など) を模倣するために必要ではない他のプロパティがいくつかあるかもしれませんが、それらはこの質問には重要ではないと思います。
私の現在のマッピングは次のようになります。
ParentNode マッピングは単純な多対 1 マッピングであるため、簡単です。これは私が持っているコードです(テストされていませんが、正しいと思います):
子ノードのマッピングは、現在の ID と等しい ParentNodeId を持つすべての SiteMapNode オブジェクトを戻す単純なバッグにする必要があります。このバッグについてはまだ書いていませんが、それほど大したことではないと思います。
解決できないように見える問題は、次/前の兄弟プロパティを実行する方法です。このオブジェクトは、各ノードの次の式から導出できます。
- PreviousSibling: 現在のオブジェクトと同じ ParentNode (ParentNodeId) を持ち、その OrdinalPosition は現在のオブジェクトの OrdinalPosition よりも 1 小さい必要があります。
- NextSibling: 現在のオブジェクトと同じ ParentNode (ParentNodeId) を持ち、その OrdinalPosition は現在のオブジェクトの OrdinalPosition より 1 大きい必要があります。
これは、多対 1 マッピングの正式な属性によって実現できると思います。これは可能ですか?これがどのように機能するかの良い例は見つかりませんでした。
nhibernate - NHibernateのマップされていない列?
Oracleのレガシーデータベースを使用していて、一部のテーブルには、ドメインモデルでは不要なNOT-NULLに設定された列がありますが、明らかに、少なくともいくつかのデフォルト値をどこかに指定する必要がありますデータベースに保存されます(たとえば、Groupsテーブルには「インデント」列がある場合があります。thaqtは常にchar(8)値を期待します)。
NHibernateでこれをどのように処理しますか?これを行う「簡単な」方法はありますか?そうでない場合、私がこれを行う方法を誰かが知っていますか(私はインテセプターを使用することを考えましたが、実際にはどこから始めればよいのかわかりません...)。データベーススキーマを変更できないので、残念ながらこれはオプションではありません(流暢なバージョンでも問題ありません...)。
nhibernate - NHibenate カスケード問題
こんにちは、次のシナリオで子オブジェクトの更新に問題があります。
マッピングは次のとおりです。
親: カレンダー
子: DefaultCategory
カレンダーの更新に使用されるコード:
問題は、UI を介して defaultCategories を追加または削除し、更新されたバージョンのカレンダーをバックエンドに送り返すと、NHibernate が更新されたカレンダーを返し、すべてが正常に見えることです。ただし、削除されるべき defaultCatergories は、デフォルトの Categories テーブルに残されます。したがって、UI を更新してカレンダーを再度呼び出すと、コレクションが変更されていないことがわかります。
すべての defaultCatergories を parentID で削除してから再作成する必要があると思いますか? 私はNHibernateがあなたのためにこれを処理したという印象を受けましたか? どんな助けや指針も大歓迎です。
nhibernate - (Fluent) NHibernate : 異なるテーブルのフィールドで構成される 1 つのエンティティ
異なる DB テーブルのフィールドで構成されるエンティティを持つことができるように、NHibernate マッピングを記述する方法はありますか?
たとえば、個人と住所のテーブルがあり、個人オブジェクトに住所フィールドを表示したいとします。
次のようなエンティティが必要です。
nhibernate - NHibernate を使用してプロパティにデフォルト値を設定することは可能ですか?
マッピングには Fluent NHibernate を使用し、データベース スキーマへの SchemaExport クラスを使用しています。
NHibernate を使用して、生成されたデータベース スキーマのプロパティ/列のデフォルト値を設定することはできますか?
nhibernate - NHibernate 2.* マッピング ファイル: null 許容の DateTime 型を定義する方法 (DateTime?)?
NHibernate 2.* での重大な変更の 1 つは、NHibernate.Nullables がサポートされなくなったことです。したがって、null 許容の DateTime をマップするには、マッピング ファイルで何を使用しますか? タイプ?すなわち:
当然のことながら動作しません:
サポートされなくなりました:
私はそれがとても明白でなければならないことを知っていますが、私はそれを見つけられません!
答えは簡単です: NHibernate は問題のクラスを反映し、プロパティの反映された型が DateTime であることを発見しますか? すべて独自に。
ありがとう@ジャスティス!
c# - 自己結合関係に追加のプロパティがある場合の NHibernate マッピング
その関係自体にプロパティがある場合、クラスを同じクラスの他のインスタンスにどのようにマップしますか?
テーブル Person にマップされている Person というクラスがあります
PersonPerson という結合テーブルを使用して、Person と Person の間に多対多の関係が必要です。
PersonPerson テーブルに次の属性が必要です。
この質問とBilly McCafferty によるリンク先の投稿では、PersonPerson テーブルに列が追加されているため、PersonPerson 関係を通常の JOIN から独自のエンティティに昇格させる必要があると説明しています。ただし、自己結合の場合はどうすればよいかは説明されていません。違いは、すべての関係者をDave Dee (ID = 1)に依頼すると、 Tich (ID = 5) だけでなくDozy (ID = 2)も取得する必要があることです。RelatedPersonID 列にもあります。
これまでの私の解決策は、 Person クラスに 2 つのプロパティを持つことです。
そして、hbm に次のように記述します。
これはささいな不格好でエレガントではないようです。NHibernate は通常、ほとんどの日常的な問題に対する洗練されたソリューションを備えています。上記はこれを行うための賢明な方法ですか、それともより良い方法がありますか?