4

次のコードがあるとします。

TEModule teModule = Context.TEModules.Where(module => module.EnumValue.Equals(text.ModuleName)).FirstOrDefault();
if (teModule == null)
{
     teModule = new TEModule();
     teModule.EnumValue = text.ModuleName;
     Context.TEModules.AddObject(teModule);
     //Context.SaveChanges();
     TEModule aux = Context.TEModules.Where(module => module.EnumValue.Equals(teModule.ModuleName)).FirstOrDefault();
}

私の問題は、「SaveChanges 」をコメントのままにしておくと、「 AddObject」メソッドを呼び出しても Context.TEModules が空であるため、次のクエリで補助オブジェクトが常に null になることです。ただし、AddObject の後に SaveChanges を呼び出すと、次のクエリで補助オブジェクトは null ではありません。問題は、SaveChanges をそれほど頻繁に呼び出したくないということです。これはオブジェクトを追加する唯一のコードではなく、そうするとパフォーマンスが低下するからです。

質問は次のとおりです。後でオブジェクトが既に存在するかどうかを知る必要がある場合、AddObject 呼び出しのたびに SaveChanges を呼び出す必要がありますか?

4

1 に答える 1

5

linq-to-entities クエリの目的は実行されることであり、実行はデータベースで実行されるため、エンティティを保存していない場合、そのデータベース表現は存在しません。

ローカルに保存された (まだ永続化されていない) エンティティを見つける必要がある場合は、ObjectStateManager代わりにクエリを実行する必要があります。

var entity = Context.ObjectStateManager.GetObjectStateEntries(EntitiState.Added)
                                       .Where(e => !e.IsRelationship)
                                       .Select(e => e.Entity)
                                       .OfType<TEModule>()
                                       .FirstOrDefault(m => m.EnumValue.Equals(teModule.ModuleName));
于 2011-08-30T10:40:51.100 に答える