web-dev-qa-db-ja.com

DbContext.SaveChangesを呼び出す前にEntity Frameworkにクエリを実行することは可能ですか?

この単純な例では、EventとAddressの2つのエンティティがあります。コンソールアプリケーションを毎晩実行して、XMLソースからイベントデータをインポートし、データベースに追加しています。

(Entity Frameworkコンテキスト内の)XMLイベントノードをループするときに、指定された値を持つアドレスレコードがデータベースに既にあるかどうかを確認します。そうでない場合は、新しいレコードを追加します。

using (DemoContext context = new DemoContext())
{
    foreach (XmlNode eventNode in eventsXml.SelectNodes("/Events/Event"))
    {
        Event newEvent = new Event();

        newEvent.Title = **get from XML**

        Address address = context.Addresses.Where(a =>
            a.Title.Equals(title, StringComparison.OrdinalIgnoreCase) &&
            a.Address1.Equals(address1, StringComparison.OrdinalIgnoreCase) &&
            a.Address2.Equals(address2, StringComparison.OrdinalIgnoreCase) &&
            a.City.Equals(city, StringComparison.OrdinalIgnoreCase) &&
            a.State.Equals(state, StringComparison.OrdinalIgnoreCase) &&
            a.ZipCode.Equals(zipCode, StringComparison.OrdinalIgnoreCase)
        ).FirstOrDefault();

        if (address != null)
            newEvent.Location = address;
        else
        {
            newEvent.Location.Title = title;
            newEvent.Location.Address1 = address1;
            newEvent.Location.Address2 = address2;
            newEvent.Location.City = city;
            newEvent.Location.State = state;
            newEvent.Location.ZipCode = zipCode;
        }

        context.Events.Add(newEvent);
    }

    context.SaveChanges();
}

すべてのイベントの後にcontext.SaveChanges()を呼び出すとパフォーマンスが低下するので、これを最後にすべて実行します(またはバッチで実行しますが、この問題には関係ありません)。ただし、context.Addressesに対してクエリを実行すると、context.SaveChanges()を呼び出して重複レコードを取得するまで、新しいアドレスが認識されないようです。

私の目的では、各レコードの最後ではなく、最後に保存してもかまいませんが、適切で単純な代替手段があるかどうかを知りたいです。

28
JKasper11

データベースを操作する方法でクエリを実行すると、コンテキストに新しく追加されたエンティティは結果に含まれません。 EF 4.1ではDbSet<T>.Localから入手できます

見る :

Entity Frameworkクエリが保存されていないエンティティを返さない理由

そして

エンティティフレームワーク:最近コンテキストに追加されたオブジェクトを再検索

26
Alireza

DbSetに対して直接クエリを実行すると、常にデータベースにクエリが送信されます。 Entity Framework 5 – DbSet.Localプロパティを使用すると、メモリ内データ(自分で作成するか、データベースからロードする)を操作できます。

この記事を見てください: http://msdn.Microsoft.com/en-us/data/jj592872.aspx

1
Eugene Griaznov