29

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

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

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() を呼び出すまで新しいアドレスを認識していないように見えるため、重複したレコードが取得されます。

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

4

2 に答える 2

1

DbSet に対して直接クエリを実行すると、常にクエリがデータベースに送信されます。Entity Framework 5 には、(自分で作成した、またはデータベースからロードした) メモリ内データを操作できる DbSet.Local プロパティという優れた代替手段があります。

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

于 2013-10-13T15:03:19.487 に答える