問題タブ [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 投票する
1 に答える
677 参照

nhibernate - 親クラスを持つクラスには多くのアイテムがあります - コードによるマッピングでは不可能です

nHibernate に問題があります。エンティティが基本エンティティから継承する場合、この子エンティティは別のエンティティから参照できません。


次のように、データベースに継承階層があります。

  • VideoFeedありますVisualFeed
  • VideoFeed多くを持っていますPlaylistAssignment

これが(言い換えられた)SQL定義です

そして、クラス定義

VisualFeed(親クラス)のマッピング コードは次のとおりです。

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

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

を呼び出すときに例外がスローされModelMapper.CompileMappingForAllExplicitlyAddedEntitiesます。

例外は、ファイルKeyMapper.csの nHibernate コード内でスローされます。

ownerEntityTypeReflectedTypeは「VideoFeed」に等しく、とは両方ともDeclaringType「VisualFeed」(親クラス名) に等しくなります。これはすべて正しいですが、ArgumentOutOfRangeExceptionがスローされます。


誰でも回避策を考えることができますか?


後で編集この問題は、への明示的な参照呼び出しが原因でしたsetPropertiesMapper。実際には、私が質問から省略した別の子クラスにありました(問題を単純化するための誤った試みで)。

実際の原因は、以下の「cms_VisualFeedAssignment」へのマッピングにあります。

呼び出しをコメントアウトするPropertyRefと、うまくいきました。

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

nhibernate - NHibernate: 継承された id プロパティを解決できません

私は以下に定義されたエンティティを持っています:

そして、ここに基本クラスがあります:

「Id」プロパティを「複合キー」としてマップするので、次のマッピング クラスを追加しました。

それはすべてとてもいいことですが、次のクエリ試行でエラーが発生します。

私が得るエラーは次のとおりです: NHibernate.QueryException : プロパティを解決できませんでした: Id of: Foo

基本クラスを削除し、すべてを「Foo」内にカプセル化することで、魅力的に機能するため、非常に奇妙です。前もって感謝します。

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

nhibernate - 新しい NHibernate エンティティを挿入し、すぐに親に割り当てます

私は、私のデータ層で次のようにマッピングされた私のOracleデータベースに親と子のオブジェクトBOOKLETとDEMOGRAPHICS_INFOを持っています:

エンティティをその方向にたどる必要がないため、ブックレットへの DemographicsInfo 関係を意図的に省略しました。ManyToOne 関係は、実際には 1 対 1 になります。

DemographicsInfo を作成し、すぐにその親 Booklet に割り当てることができることを確認するためのテストを作成しました。これは次のようになります。

Save() を呼び出すと、次の例外が発生します。

これは、Insert() で demInfo オブジェクトに Id が与えられていないためです。私の Insert 実装は次のようになります。

_session は NHibernate ISession です。新しいエンティティを保存し (正常に持続します)、セッションをフラッシュしたため、demInfo 変数に Id があると予想されますが、ID は 0 のままです。これは、親オブジェクトを保存しようとすると、外部キー違反になります。ここでステップを見落としていますか?新しい子を既存の親に追加するためのパターンを再考する必要がありますか?

0 投票する
3 に答える
2545 参照

nhibernate - How to map ntext using NHibernate Mapping-By-Code feature of NHibernate 3.2?

I need to map ntext column of a table using the mapping by code feature in NHibernate 3.2, so that it doesn't get truncated to 4000 characters.

What do I neet to change in the following example? "Notes" is the property which has ntext type in sql table:

Property(emp => emp.Notes);

Note: Please don't mix it with fluent NHibernate or hbm file mapping.

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

nhibernate - NHibernate のバージョン管理 - ISession.Save を呼び出した後の例外

この質問を投稿する前に、NH バージョニングに関する多くの例を見てきましたが、それらすべてが以下のコードを使用していることを示しています。MappingByCode を使用して、バージョン管理されたエンティティを作成できます。

MyVersion の割り当ては SQL Server が行うべきだと思っていました。したがって、ISession.Save または ISession.SaveOrUpdate; を呼び出すと、NHProf は、生成された sql に Insert ステートメントに渡された MyVersion パラメータが含まれていないことを示していますが (予想どおり)、SQL Server がそれを生成しないため、クエリの実行は失敗します。結果はcannot insert null value into MyVersion column...エラーです。

VersionGeneration.Always についての私の期待は正しいですか? それで何が悪いの?

NHibernate 3.3 / SQL Server 2012 を使用しています

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

nhibernate - nHibernate マッピングの問題 -- 子と孫を削除せず、null する

引用符

データのマッピングに ByCode メソッドを使用しています。

各ステップに割り当てられた ProcessStepUser (ProcessStepUser テーブル) オブジェクトの Bag を持つ ProcessStep (ProcessStep テーブル) オブジェクトのリストを持つ Process (Process テーブル) オブジェクトがあります。

オブジェクトは正常に読み込まれますが、Web ページでコレクションから Step を削除し、プロセスとして MVC アクションに再水和してプロセスを保存すると、データベース内の Step の ProcessId が null に設定され、リンクが切断されます。ただし、ステップはデータベースとそれに割り当てられたすべてのユーザーに残されます。

私ができるようにしたいのは、ステップを削除し、その ProcessStep とそのすべての ProcessStepUsers を削除することです。

同様に、ProcessStep を編集して (たとえば、ステップの名前を変更して) 保存すると、それは保存されますが、ProcessStep ユーザーは (ProcessStepId から) 無効になり、再作成され、孤立したレコードが残ります。

ProcessId 全体の ProcessStepUser にも列があるため、ユーザーがプロセスのどのステップにも複数回割り当てられるのを防ぐことができます。

私の関連するマッピングは次のとおりです。

プロセス:

プロセスステップ:

ProcessStepUser

先ほど言ったように、作成時に問題なく保存され、表示用に問題なくロードされます。しかし、ステップのドロップまたはステップの編集は、データベースに大混乱を引き起こしています。

プロセスマスターオブジェクトを保存する前にフラグを立てて手動で削除することで、ステップ削除プロセスをハッキングしましたが、可能であれば、nhibernate にすべて実行してもらいたいです。

ありがとう!

引用符

最初に、Cascade.All.Include(Cascade.DeleteOrphans) で 1 つの問題を見つけた Martin に感謝します... それは私が持っていた元のコードでした。

いくつかのテストを書き直しましたが、マッピングは実際には問題なく機能しています。私はこの質問を削除しますが、サイトでは (Firefox で) 編集することしかできません...

問題は、データベースから Process オブジェクトを取得し、それを JSON オブジェクトとして View にシリアル化していたためです。次に、Process オブジェクトにバインドされた JSON オブジェクトを返しました。

要するに、私たちのリポジトリはオブジェクトに対して SaveOrUpdate(obj) を呼び出していましたが、接続が切断されていたため、Merge(obj) を呼び出す必要があり、実行して完全に機能しました。

この質問に価値があるかどうかは、権力者に委ねます。

ありがとう!

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

c# - 10 進数識別子の位取りと精度を設定する

私たちは、96 ビットの数値 ID を作成する分散シーケンシャル ID ジェネレーターに取り組んでいます。この値のアプリケーションで使用するデータ型は ですdecimal。データベース側では、列のデータ型はdecimal(28,0).

問題は、コードでマップして Id を構成するときに、精度とスケールを指定できないことです。理想的には、次のようなものが必要です。

それを無視しようとすると、NHibernate はパラメータを作成してコマンドを発行するときに使用に戻りdecimal(28,5)ますが、これは機能しません。

チケットがあることは承知しており、そのうちに貢献したいと思います。それまでの間、これがうまくいくかどうかを確認する必要があるため、これに対する回避策があるかどうか疑問に思っています. カスタム型、逆シリアル化された HBM のハック、そのようなものはありますか?

から派生する独自の型を作成しようとしましたが、独自の精度とスケールを指定DecimalTypeした を返すプロパティをオーバーライドしましたが、SqlType何も起こらなかったようです。

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

c# - マップされていない抽象中間クラスから継承する結合されたサブクラス

概念的には次のようなクラス階層があります。

ここに画像の説明を入力

つまり、抽象基本クラス ( Relation) といくつかの派生クラスがあります。実際には、多くのコードCustomerSupplier共有するため、共通点を抽象クラスにリファクタリングしましたBusinessContact。実際のクラス階層は次のようになります。

ここに画像の説明を入力

またはコードで:

コードによるマッピング ( ) を使用して、NHibernate の結合サブクラスを使用して、この階層を 4 つのテーブル ( RelationContactPersonCustomerおよび)にマッピングしたいと考えています。私のマッピングは次のようになります。SupplierModelMapper

ただし、マッピングを構成に追加しようとするとすぐに例外が発生します。

なぜこれが起こるのか、私は基本的に理解しています。生成されたマッピングは次のようになります。

Customerモデル内の「通常の」エンティティであるかのように、属性で定義SupplierBusinessContactます。のマッピングがないため、これは失敗するか、もちろんです。"Name" プロパティ (で定義されている) もマッピングに表示されないことに注意してください。extendsBusinessContactBusinessContactBusinessContact

マッピングを次のように表示したいのは次のとおりです。

つまり、Relation を作成Supplierして拡張し、(マップされていない)クラスCustomerのすべてのマップされたプロパティを含めます。BusinessContact

どうすればこれを達成できますか?

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

c# - NHibernate: クエリ パラメータのデータ型と長さを明示的に設定する

コードとSQ​​Lサーバー2012によるNHibernateマッピングを使用しています。セッションファクトリのドライバーとしてSql2008ClientDriverも使用しています。私は正確な sql 型と長さをテーブルを表す C# オブジェクトにマップする方法を理解しようとしています。私が得ている問題は、生成されたSQLで指定されたデータ型、特に文字列に関するものです。

例えば:

パブリック仮想文字列 SomeProperty { get; 設定; }

これは、クエリの生成時に nvarchar(4000) パラメーターに変換されますが、この列はデータベースでは char(6) です。マッピングでこれを何らかの方法で指定することは可能ですか?

クエリを実行する前にSQLサーバーが変換を行っているため、パフォーマンスが低下していると思います。

私はこれを試しました(そしてうまくいきません):http://notherdev.blogspot.com.au/2012/01/mapping-by-code-property.html

何か案は?