問題タブ [identity-map]
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 - 変更を保存する前に ObjectContext から新しく追加されたエンティティを取得する
OK、私はこれらを読みました:
EntityFramework 変更を保存する前にエンティティを表示
追加されたオブジェクトは ObjectContext のどこに保存されますか?
問題の明確な解決策はないと思いますが (2 回目の投稿は 2009 年のものですが)、Entity Framework の重要な問題だと思うので、それでも質問します。
次のようなコードがあるとします。
NHibernate を使用する場合、UnitOfWork 実装は ISession インスタンスをカプセル化します。そして、指定されたコードは期待どおりに動作します。変更がコミットされる前に、新しく追加されたカテゴリをリポジトリ (つまり、基礎となる ISession) から取得できます。
Entity Framework の動作が異なることに驚きました。UnitOfWork 実装が EF の ObjectContext をカプセル化する場合、アサーションは失敗します。( unitOfWork.Commit() メソッドで) ObjectContext.SaveChages() を呼び出す前は、新しく追加されたカテゴリには (同じ ObjectContext を介して) 到達できません。この動作を構成する ObjectContext のプロパティを見つけようとしましたが、成功しませんでした。
だから私の質問は: ObjectContext.SaveChages() を呼び出す必要なく追加したばかりの ObjectContext からエンティティを取得することは可能ですか (ビジネス トランザクションが終了するまでコミットしたくないため)? 答えが「いいえ」の場合、これは特にアイデンティティ マップ デザイン パターンおよび UnitOfWork パターン全般に対する違反ではありませんか? また、EF を使用する場合、このシナリオにどのように対処しますか?
前もって感謝します。
皆さん、遅れてすみません。
あなたは私の言いたいことを理解していないようです。問題は、「追加したばかりのこのインスタンスを取得する方法」ではありません。結局のところ、私はそれを参照しています。問題は、「新しく追加された (まだコミットされていない - 実際にはコミットされない可能性がある) エンティティは、指定された DbSet に対するクエリでどのように考慮されるのですか?」
新しいカテゴリを追加して、そのようなものを書いた場合 (ここでは意図的にリポジトリを使用していませんが、わかりやすくするために DbContext (または EF 4.0 を使用している場合は ObjectContext) を行しています):
条件を満たした場合、新しいカテゴリが結果セットに返されるようにします。おそらく、このクエリは、単一のトランザクション (作業単位) 内で同じコンテキスト (リポジトリ) を共有する別のメソッド (または別のクラス) で実行されます。Categories.Local に対して同じクエリを実行し、新しく追加されたエンティティのみに結果をフィルター処理して (Local には現在追跡されているセットのすべてのエンティティが含まれているため)、それをデータベースから返された結果と組み合わせることができることを知っています。すごく醜いと思いませんか?そして、今何かが欠けていないかどうかさえわかりません。これはすべて ORM の作業です。それはすべてトランザクションの動作 (作業単位) に関するものであり、ORM がそれを処理する必要があります (NHibernate のように)。
今、それはあなたにとって意味がありますか?
design-patterns - 多対多の関係を逆方向にナビゲートするためのパターン/構造?
ユーザーストーリー:
アプリのユーザーがロードトリップを作成します。Aroadtrip
は一連の興味深い目的地です。それぞれdestination
に、そこにいる間に見るべき活動や光景に関する詳細がいくつかあります。このようにして、ユーザーは 2 つの遠征を定義します。各旅行にはいくつかの固有の目的地といくつかの共通の目的地があります。たとえば、両方の旅行に The Smithsonian が含まれます。アプリはすべての更新をメモリに保持し、ユーザーが [保存] をクリックしたときにのみデータベースにコミットします。ユーザーは両方の旅行を積極的に更新し、自由に切り替えることができます。アプリのポイントでは、スミソニアンの目的地を扱っていますが、目的地から目的地を含むロードトリップまでオブジェクト階層を上に移動する必要がある場合があります。問題は、目的地が 2 回の遠征に参加することです。
宛先オブジェクトのコピーが 1 つだけであることを保証しながら、後方へのナビゲーションを可能にするために使用できる優れた設計パターンまたはデータ構造は何ですか?
要件:
- モデルは多対多の関係に関係しています。
- すべてのモデルをメモリ内で 1 回だけ表現します (アイデンティティ マップ)。
- データ構造は簡単にナビゲートできる必要があります。親から子にナビゲートできるだけでなく、子から、子が最初にフェッチされた親にナビゲートすることもできます。
- データ モデルに追加のスキーマを導入することは避けたいと考えています。
これまでの私の最善のアイデアは、各宛先オブジェクトをコンテキスト オブジェクトでラップすることです (リンクされたリストがノードをラップする方法と同様)。コンテキスト オブジェクトは、最初にフェッチされた親へのポインターを維持します。各宛先は常にそのラッパーを介して処理します。これは Proxy パターンか Decorator パターンのどちらかだと思います (私は Proxy の方に傾いています)。(これは本質的に、jQuery オブジェクトが多くの要素を包含し、複数の jQuery オブジェクトが同じ要素への参照を共有する方法と同じ考え方ではないでしょうか?)
「現在のロードトリップ」コンテキスト変数を維持することを検討し、それを目的地からそれを含むロードトリップまでナビゲートするために使用しました。これは、実際の「フェッチ コンテキスト」ほど信頼性が高くありません。実際、それはまったく異なるタックであり、私はそれが好きかどうかわかりません.
ActiveRecord で同じ問題が発生したことを覚えています (ただし、使用してからしばらく経ちます)。AR では、RoadTrip1 から始めてその目的地をフェッチした場合、目的地からロード トリップまで (ある種のフェッチ コンテキストを介して) うまくナビゲートできませんでした。代わりに、私は両方の両親 (遠征) を検討する必要があり、どうやってそこにたどり着いたかについての指標はありません。右?
他の人は以前にこの問題に遭遇したことがありますか? つまり、多くの親が後方ナビゲーションを混乱させている場所で後方にナビゲートしたいということですか? 「私はどちらの親からここに来たのですか?」と尋ねたことはありますか? あなたはそれにどう答えましたか。
rails-3.1 - Rails 3.1レコードオブジェクトはコントローラーアクションで2回インスタンス化しますか?
基本的にレコードをフェッチしてオブジェクトにインスタンス化するコントローラーがあります。
実行すると、オブジェクトは異なる object_id で 2 回インスタンス化されます。
例えば
これにより、レールが実行されているターミナルに 2 つの異なる ID が出力されます (レール 3.1 のみ)。Rails 3 では、id は 1 つだけです。また、DB またはリソースへの 2 つのクエリに対して 2 つの異なるユーザー オブジェクトをインスタンス化しました。
私は見当もつかない。何をグーグルで検索すればよいかさえわかりません。について何かを見ましたActiveRecord::IdentityMaps
が、ここで何が問題なのかわかりません。
asp.net - ASP.NETWebアプリケーションでのDataMappersのストレージ
MartinFowlerの「PatternsofEnterpriseApplication Architecture」では、エンティティのマッパーのセットのようにDALを編成するためのアプローチについて説明しています。それぞれに、特定のエンティティを格納する独自のIdentityMapがあります。
たとえば、私のASP.NETWebアプリケーションでは次のようになります。
}
問題は、これらのマッパーをどこに保存するかということです。システムサービス(エンティティ)はどのようにマッパーを呼び出す必要がありますか?
すべてのマッパーを含むMapperRegistryを作成することにしました。したがって、サービスは次のようなマッパーを呼び出すことができます。
しかし、MapperRegistryインスタンスはどこに保存できますか?次の亜種が表示されますが、どれも好きではありません。
MapperRegistryはアプリケーションに対してグローバルです(シングルトン)
- マルチスレッドASP.NETアプリケーションでの同期が必要なため、適用されません(少なくとも、Martinは、このバリアントを選択できるのは狂牛病だけだと言っています)
セッションごとのMapperRegistry
- あまり良くないようです。すべてのORM(NHibernate、LINQ to SQL、EntityFramework)マスターは、リクエストごとにDataContext(NHibernateSession、ObjectContext)を使用し、Sessionにコンテキストを格納しないようにアドバイスします。
- また、私のWebAppでは、ほとんどすべてのリクエストは、JSONを返すEntityController.asmx(属性ScriptServiceを使用)へのAJAXリクエストです。そして、セッションは許可されていません。
リクエストごとのMapperRegistry
- 個別のAJAX呼び出しがたくさんあります。この場合、MapperRegistryのライフサイクルは小さすぎます。そのため、ほとんどの場合、データはデータベースから取得され、その結果、パフォーマンスが低下します。
親愛なる専門家、建築ソリューションを手伝ってください。
entity-framework - Entity Framework に新しいインスタンスを返すように強制する
コードには、エンティティのいくつかのプロパティのみを変更できるシナリオがあります。それを保証するために、次のようなコードがあります。
このコードの問題は、 への呼び出しがクラスdbContext.GetCustomerById
の新しいインスタンスを常に提供するとは限らないことです。Customer
顧客がデータベースから既にフェッチされている場合、Entity Framework はインスタンスをメモリに保持し、その後のすべての呼び出しでそれを返します。
これは実際の問題につながります -customer
そしてoriginalCustomer
同じインスタンスを参照しているかもしれません. その場合、customer.Name
は等しくなりoriginalCustomer.Name
、データベースと異なるかどうかを検出できません。
IDマップの設計パターンのため、他のほとんどのORMにも同じ問題が存在すると思います。
これを解決する方法はありますか?どうにかして EF に顧客クラスの新しいインスタンスを常に与えるように強制することはできますか?
それとも、代わりにコードをリファクタリングする必要がありますか? このシナリオの優れた設計パターンを知っている人はいますか?
.net - エンティティ フレームワーク 4 の内部キャッシュを無効にする方法
私が知っているように、Entity Framework は Identity Map パターンを実装しているため、EF はいくつかのエンティティをメモリにキャッシュします。
例を挙げましょう。
最初のコンテキストのキャッシュを無効にして、コンテキストstudent
を再作成せずに新しいエンティティを取得する方法はありますか?
手伝ってくれてありがとう。
ruby-on-rails - ID マップが有効な場合、Mongoid は has_many リレーションでのみ _id フィールドを返します
モンゴイド 2.4.4 レール 3.2.1 モンゴ DB 2.0.1
私は3つのモデルを持っています:
認証、お気に入り、コンテンツ。</p>
これは、認証からお気に入りを介したコンテンツへの多対多の関係のようなものです。
このようにクエリすると:
@favorites = Favorite.any_in(authentication_id: list).includes(:content, :authentication).desc(:collected_at).page params[:page]
@favorites は正常に動作します
@favorites のコンテンツも正常に機能します。
しかし、@favorites の認証には _id しかなく、他のすべてのフィールドは nil です
identity_map_enabled: false を設定すると、修正されました。
これはidentity_mapのバグですか?
tracert に関する情報を
次に示します。ID マップが有効になっていると、f.weibo.name が nil であることがわかります。
identity_map_enabled: true の場合、この問題を修正するにはどうすればよいですか?
--------------------- モデル -------------------------------- -----
-------------- デバッグ コード: -----------------------
--------- デバッグコード終了 ----------------------
--------- LOG identity_map_enabled: true --------------------
--------- LOG identity_map_enabled: false --------------------
c# - エンティティ フレームワークが作業単位で ID マップを実装しないのはなぜですか?
私は次のようにテストコードを書きました:
dbset が追加されたエンティティを返すことを期待していました。しかし、変更が実際のDBに保存された後にのみ、私は異議を唱えます。
c# - ID マップ パターンとテーブル データ ゲートウェイ c#
プロジェクトに Identity マップ パターンと DataMapper パターンを実装しています。しかし、私にはいくつかの問題があります。
ゲートウェイによってデータベースからデータを取得するとき、オブジェクトの新しいインスタンスを作成してリストを返します...
Identy Map に関してデータベースからデータを取得するための最良の方法は何ですか? データベースから患者を取得し、これらのデータをユーザーに表示したい..
Identity map のオブジェクトの ID はどうですか? 私の解決策(私の考えでは):1)デフォルトIDで新しいオブジェクトを作成する2)オブジェクトをデータベースに保存する3)データベース内の最後のオブジェクトのIDを取得する4)オブジェクトの新しいIDを設定する5)新しいIDでキャッシュに保存する... .
それは良い解決策ですか?
ご協力いただきありがとうございます!
私のアイデンティティマップオブジェクト(シングルトン):
Pacient Mapper があります。