問題タブ [dapper]
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.
parameter-passing - Dapper: パラメータは何にでも使用できますか?
アプリケーション用にデータベースを準備するコードを書いています。コードには、テーブルを作成しているときにいくつかの繰り返しの SQL ステートメントがあり、いくつかのメソッドでそれらを非表示にしたい (現在のところ、主キーを作成し、テーブルの ID を自動インクリメントにするのは 2 つだけです)。ポストグル)。主キーの単純なケースでは、最初に次のような関数を作成しました。
エラーと例外をいじくり回した後、最終的に、この方法でパラメーターを使用することは実際にはサポートされていないという結論に達したため、従来のstring.Format()
呼び出しに切り替えましたが、すべてうまくいきました。
しかし、私は本当に満足していません。このパラメーターの使用方法は本当にサポートされていませんか? もしそうなら、これらのパラメータを安全に使用できる場所はどこですか? ストアド プロシージャ パラメータを使用できる場所など、SQL クエリの可変部分のみですか。
c# - Unit of Work パターン - 親子関係の管理
私はマイクロオーム (ダッパー) を使用しており、リポジトリで使用する作業単位 (UoW) の実装を考え出そうとしています。UoW で親子 (外部キー) の関係をどのように処理するのが最善なのか、少し困惑しています。たとえば、データベース テーブルに直接マップする次の 2 つのエンティティがあるとします。
User は、外部キー User.ClientDatabaseId を介して ClientDatabase と親子関係を持っています。User と ClientDatabase の両方の Id プロパティは ID 列です。私の UoW インターフェイスは次のように定義されています。
ある時点で、同じ IUnitOfWork 内で、ClientDatabase と User の両方に対して MarkNew() を呼び出し、次に Commit() を呼び出したいと考えています。今私がしたいことは、ClientDatabase が最初に保存され (子エンティティ)、次に ClientDatabase に設定された Id がデータベース挿入の結果として、その前に User の ClientDatabaseId 外部キー プロパティとして設定されることです。もデータベースに挿入されます。誰かがこの種の問題を素敵な一般的な方法で解決したかどうか疑問に思いましたか?
sql-server - Dapper.NETおよび複数の結果セットを持つストアドプロシージャ
複数の結果セットを返すストアドプロシージャでDapper.NETを使用する方法はありますか?
私の場合、最初の結果セットは単一の行と単一の列です。その場合0
、呼び出しは成功し、2番目の結果セットには実際のデータの行/列が含まれます。(ゼロ以外の場合、エラーが発生し、2番目の結果セットは提供されません)
Dapper.NETでこれを処理するチャンスはありますか?これまでのところ、私はそのシングルを取り戻すだけです0
が、それ以上は何もありません。
更新: OK、正常に動作します-結果がnoである限り。2は単一のエンティティです。
今、私にはさらに別の要件があります。
その2番目の結果セットに対するDapperのマルチマッピング(SQL Serverから返された単一の行を2つの別々のエンティティに分割する)は、現時点ではサポートされていないようです(少なくとも、.Read<T>
処理できるオーバーロードはないようです)マルチマッピング)。
その行を2つのエンティティに分割するにはどうすればよいですか?
dapper - オブジェクト階層を作成するマルチマッパー
文書化された投稿/ユーザーの例によく似ているように見えるので、私はこれを少しいじっていますが、少し異なり、私にとってはうまくいきません.
次の単純化されたセットアップを想定しています (連絡先には複数の電話番号があります)。
複数の Phone オブジェクトを持つ Contact を返すものに行き着きたいと思っています。そうすれば、2 つの連絡先があり、それぞれに 2 つの電話がある場合、SQL はそれらの結合を合計 4 行の結果セットとして返します。次に、Dapper は、それぞれ 2 つの電話を持つ 2 つの連絡先オブジェクトをポップアウトします。
ストアド プロシージャ内の SQL は次のとおりです。
私はこれを試しましたが、4つのタプルになりました(これは問題ありませんが、私が望んでいたものではありません...結果を再正規化する必要があることを意味します):
別の方法 (下記) を試すと、「'System.Int32' 型のオブジェクトを 'System.Collections.Generic.IEnumerable`1[Phone]' 型にキャストできません」という例外が発生します。
私は何か間違ったことをしているだけですか?投稿/所有者の例と同じように見えますが、子から親ではなく親から子に移動する点が異なります。
前もって感謝します
c# - Dapperサンプルコードの明確化
私はDapperを理解しようとしていますが、非常に基本的なものが欠けているようです。誰かがGoogleコードのDapperホームページから取得した次のコードを説明し、From句がない理由とQueryメソッドの2番目のパラメーターを説明できますか(動的)匿名タイプが渡されます。これはどういうわけかコマンドオブジェクトを設定していると思いますが、単なる致命的な用語で説明したいと思います。
ありがとう、スティーブン
c# - AnsiStrings はデフォルトで Dapper で使用できますか?
文字列が主に列に格納されているデータベースに対して Dapper を使用していVarChar
ます。デフォルトでは、Dapper はNVarChar
クエリを生成するときにパラメーターを使用します。使用するすべての文字列パラメーターをラップできますがDbString
、デフォルトで AnsiStrings を使用DbString
してNVarChar
ケースに使用するのは素晴らしいことです。
Dapper ソースの型マップを から に変更しようとしましたDbType.String
がDbType.AnsiString
、パラメーター デリゲートの IL 生成でエラーが発生するようです ( をスローしますInvalidProgramException
)。
これを行う簡単な方法はありますか?
アップデート
typeMap を変更するだけでは十分ではなく、いくつかのif (dbType == DbType.String)
チェックも変更する必要がありました。今それは動作します!
c# - IEnumerable の挿入Dapper でコレクションを実行すると、「クラスは Dapper でサポートされていません」というエラーが表示されます。
はい、dapper-dot-net を使用してレコードを挿入する方法について、あちこちに質問があります。しかし、答えは有益ではありますが、私を正しい方向に向けているようには見えませんでした. 状況は次のとおりです。データを SqlServer から MySql に移動します。レコードを に読み込むのは簡単ですが、挿入物に何かが入っていません。まず、「移動記録コード」: IEnumerable<WTUser>
cnn.Query と cnn.Execute は、dapper 拡張メソッドを呼び出します。次に、WTUser クラス (注: 列名が SqlServer の 'WindowsName' から MySql の 'ResourceName' に変更されたため、2 つのプロパティは同じフィールドを指しています):
Dapper から「WTUser は Dapper でサポートされていません」という例外を受け取りました。DataMapper (dapper) のこのメソッド:
この時点で OwnerType =
System.Collections.Generic.List`1[[CRMBackEnd.WTUser, CRMBE, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
OwnerType はCRMBackEnd.WTUser
... ではないようですList<CRMBackEnd.WTUser>
... ??? 何が起こっているのかというと、コレクションのプロパティが繰り返されているからです: カウント、容量など. 何が欠けていますか?
アップデート
session.WriteData を次のように変更した場合:
レコードはうまく挿入されます...しかし、次のような例を考えると、これが必要だとは思いませんでした:
... dapper-dot-netから
c# - これをもっとLINQyに書き直すにはどうすればよいですか?
このデータセットはここにあります。イベントには、次EventGroups
のタイプのプロパティがありますList<Groups>
最後のブロックは、それよりもきれいに書き直すことができたように感じます。これをきれいにするために何ができますか?
c# - Dapper を使用した MySQL マスター/スレーブ上の読み取り/書き込み分散
MySQL マスター/スレーブ間で書き込みと読み取りを分散するために 2 つの IDbConnection オブジェクトを使用すると、dapper で問題が発生しますか?
c# - LINQ 自動生成型を使用した Dapper パラメーター化クエリ
私の仕事では、LINQ と Dapper を組み合わせて使用しています。パフォーマンス上の理由から、LINQ コードを Dapper に置き換えています。SQL Server から Visual Studio データベース ダイアグラムにドラッグ アンド ドロップして作成した LINQ データ オブジェクトが多数あります。
次の例では、既にメモリ内に LINQ オブジェクトがあり、それをクエリのパラメーターとして Dapper に渡したいと考えています。例えば:
cagedAnimal には、getter と setter を持つパブリック プロパティ AnimalId と AnimalType が含まれています。
ただし、このコードを実行すると、次のエラーが発生します。
タイプ: SMDApp.Models.Animal は dapper ではサポートされていません
次のコードは機能します。
特にオブジェクトの複数のプロパティをクエリのパラメーターとして使用している場合は、既存のオブジェクトを使用する方が便利です。これが匿名オブジェクトでは機能するが、自動生成された LINQ オブジェクトでは機能しない理由を誰か教えてもらえますか?
Ben Robinson の返信に応じて編集。
Marc Gravell の返信に応じて 2 回目の編集を行いました。