2012-03-06 11 views
1

EFのdbContextの動作についてちょっと混乱します。Entity Frameworkコンテキストとの混乱

_context.Persons.Add(_person)(人が有効なエンティティであると仮定した場合)、私が(_context.SaveChanges()を呼び出す前に)クエリーPersonsを追加すると、結果に追加された人が含まれますか?例えば

:私はこれを試してみてくださいたびにコンテキストが、私は、コンテキストにこの新しい人を追加したという事実のトラックを失ったかのように

Person _person = new Person() {Firstname = "Bill", Lastname = "Snerdly"}; 
_context.Persons.Add(_person); 
var _personList = _context.Persons.Where(p => p.Lastname.StartsWith("Sne")); 

、それはそうです。

私は、既存の人物を編集して人物を添付して状態を変更した場合、そのコンテキストを照会することで行われた変更を追跡し、結果に戻すことができます。たとえば、次のようにこの場合

//Assuming that Person 5 exists with the name William Snerdly 
Person _person = new Person() {Id = 5, Firstname = "Bill", Lastname = "Snerdly"}; 
_context.Persons.Attach(_person); 
_context.Entry(_person).State = System.Data.EntityState.Modified; 
var _personList = _context.Persons.Where(p => p.Lastname.StartsWith("Sne")); 

、5のidを持つ人が代わりにウィリアムの名前のビルでリストに表示されますように思えます。 IOWでは、コンテキストがデータを照会したが変更は保持されていたが、最初のシナリオではコンテキストがデータを照会したが追加されたアイテムは無視された。ちょっと矛盾しているようです。

これを正しく理解していますか、何か不足していますか?

ありがとうございます。

答えて

3

いいえ、データベースにはまだ存在しません。ただし、ObjectContextのObjectStateManagerを通じてアクセスすることも、DbContext/DbSetラッパーを使用している場合は、DbSetの.Localプロパティを使用してアクセスできます。

編集の場合、ORMの第1レベルキャッシュが動作しています。クエリはデータベースに対して実行されます(したがって、そこの値と比較されます)。コンテキストで姓を変更しても、変更されていない姓を探すクエリの結果が得られれば、さらに奇妙な結果になります。結果が処理されると、最初に返されたエンティティのIDがチェックされ、そのIDを持つエンティティが既にコンテキストに存在するため、そのインスタンスが返されます。これは、デフォルトの "AppendOnly"動作モードです。

あなたがしたいことはわかりませんが、ロードされたエンティティと未読のエンティティの両方の値を使用する必要があるルールに従って、変更を検証する必要があるときはすべてを理解する必要がありました。私はトランザクションを開始し、 "None"オプションを使って変更を保存し、データベース(これはデータの「マージ」ビューを含む)を再度検証し、データが無効であればトランザクションをロールバックして、またはaccepting the changesであり、そうでない場合はトランザクションをコミットします。

+0

あなたの答えに感謝します。私の投稿を編集している間にあなたは答えました。コンテキストが編集を尊重するのはなぜですか(データベースにコミットされていないにもかかわらず)が、追加を無視しますか? – RHarris

+0

今更新されました。 – cynic

+0

ありがとう、それは多くの意味があり、実際に私がやろうとしていたことに対処しています。私はEF4.1でトランザクションを処理する方法を調べる必要があります – RHarris