問題タブ [dbset]
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.
c# - エンティティ フレームワーク: DbSet の拡張方法?
次のように、独自の DbSet を定義しようとしています。
そしてそれをDbContextで使用します
私が直面している問題はUsers
、実行時に null になる (したがって役に立たない) ことですが、その理由はわかりません。のようなものdb.Users.Any(
がスローされ"value cannot be null"
ます; 代わりにDbSetを置き換えて使用すると
すべて正常に動作します。
独自の派生クラスを使用できるように、この問題を修正できるかどうか、またその方法を知っている人はいますか?
編集:
いくつかのコメントを受け取った後、なぜこれを行うのかを明確にします。コードを変更せずに、データ取得メカニズムから別のメカニズムに簡単に切り替えられるようにしたいからです。たとえば、メモリ内でキャッシュを行うことにした場合 (キャッシュは単なる例であり、他のものも変更したい場合があります) 、データベースにクエリを実行する代わりに、 Any/Find/...
inMyDbSet
をオーバーライドして辞書から読み取るだけで、残りの部分はそのままにします。コードは変更されません。このようにして、コードはデータがどのように取得されるかを気にせずに「通常の」操作を実行します。したがって、誰かがクラスを拡張せずにこれを行うメソッドを指すことができれば、DbSet
それも質問に答えます。
どうもありがとう
c# - カスタム DbSet を作成する方法
コンテキストで使用するカスタム DbSetを作成する方法
ここでは、コード サンプルを以下に示す DbSet から取得しました。
私が持っているコンテキストでは:
context.MyDbSet
" "に到達するたびにnullになります。これを単純な DbSet に変更すると機能し、適切に初期化されます。
その中にはより多くのプロパティがあります。
entity-framework - EF TPT 継承: 子ごとに 1 つの DbSet?
MSDN では、次の例で EF TPT を実装する方法を示しています。
(*)について、こんな質問があります。
階層内の子ごとに DbSet を持つことはできますか? すなわち:
他のすべてのクラスが継承するメインの親クラスが必要なため、これを求めています。
したがって、ID が与えられた場合、それが 1 つのものだけに対応することがわかります。
過去に他のプロジェクトではこれを行わず、「UserId」、「PictureId」、「GalleryId」という特定の ID を使用していました。
この場合、DbSet は 1 つだけですか?
c# - EF6: DbSet.Local にナビゲーション プロパティを含める
外部ソースからデータを xml としてロードしています。データは逆シリアル化され、オブジェクトをループ処理してドメイン エンティティに注ぎ込みます。
データ間の関係を作成し、データベース呼び出しを削減するために、アイテムが見つからない場合は最初に DbSet.Local からアイテムを取得しようとする拡張メソッドを作成し、次に示すように DbSet.SingleOrDefault() を使用してデータベースをクエリします。 .
try catch ブロックは、修正しようとしている問題を抑制するためにあります。
何らかの理由で、ローカル ストアをクエリするときのナビゲーション プロパティが設定されていません。したがって、次のようなものを使用すると
私のラムダとして、参加者の nav プロパティは null です。
このコードで常に null 参照エラーが発生しないようにする方法が必要だと思います。
ループが使用を開始する前に、データベースから参加者とイベントのデータを明示的にロードしようとしました
しかし、これは違いはありません。
ナビゲーション プロパティが null である理由と、それらを最も効率的に設定する方法を誰か教えてもらえますか?
そして、なぜ私が Find() を使用しないのか不思議に思っている人がいれば、それは、外部データが多くのプロパティと、私のシステムの主キーではない外部 ID フィールドにキー付けされているためです。
アップデート:
実際のコードを含めるのに時間をかけるつもりはありません。使用可能な例に絞り込むには多すぎるため、Customer/Order/OrderItem の典型的な例を使用してみます。
本当の問題は、ネストされたエンティティがあり、次のようなものを使用して存在を確認しようとする場合です。
これを使用する前に、Orders と Customers がコンテキストに明示的に読み込まれている場合でも、Order の nullreference エラーがスローされます。
しかし、これを行うと:
それが動作します。
Local を呼び出すときに機能しない理由を理解したい。関連する nav プロパティが既にコンテキストに読み込まれているのに、データベースにアクセスして関連するプロパティを取得する必要があるのはなぜですか? または私は何かを逃していますか?
c# - linq を使用して dbset 内のアイテムを見つける方法
私は C# を使用していますが、特定の でLINQ FindAsync
を検索するステートメントを作成するための助けが必要です。MapLocation
id
私には がありDbSet<MapCompany>
、それぞれMapCompany
に がありList<MapLocation>
ます。
私は の を持っており、id
を見つけるためにステートメントをMapLocation
書く必要があります。LINQ
MapLocation
これが私がこれまでに持っているものです:
これを正しく書くために助けてもらえますか?
前もって感謝します
c# - Entity Framework: DbSet コレクション全体を置き換える
タイプ T のエンティティに対して追加/更新を実行するジェネリック クラスがあります。このAddOrUpdate()
メソッドは、DbSet
アクションを実行するコレクションと、DbSet
. ItemExists()
コレクション内に項目がすでに存在するかどうかを確認するために使用されます。その場合は、更新します。そうでない場合は、追加します。メソッドは基本的に、渡された項目の主キーをテーブル内のすべての項目と比較し、一致する場合は true (およびデータベース オブジェクト自体) を返します。
このコードは、レコード数が少ないテーブルでは正常に機能します。ただし、より大きなテーブルの場合、このItemExists()
方法は非常に非効率的です。このメソッドは、呼び出し元メソッドの別の foreach ループ内にある foreach ループを使用し、O(n^2) を与えます。
簡単な方法は単純に を使用することですが、EF はクラスを SQL クエリに変換できないため、意味contextDataSet.Contains(item)
のある例外がスローされます。Unable to create a constant value of type
だから、それはいけません。
今、私の実際の質問:渡された全体DbSet<T>
を置き換える方法はありますか? IEnumerable<T>
渡される IEnumerable はビューのデータグリッドにバインドされ、基本的にすべてのアイテムが含まれるため、論理的に言えば、コレクション全体を置き換えることは安全です。どんな助けでも大歓迎です。
コード