この単純な例では、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()を呼び出して重複レコードを取得するまで、新しいアドレスが認識されないようです。
私の目的では、各レコードの最後ではなく、最後に保存してもかまいませんが、適切で単純な代替手段があるかどうかを知りたいです。
データベースを操作する方法でクエリを実行すると、コンテキストに新しく追加されたエンティティは結果に含まれません。 EF 4.1ではDbSet<T>.Local
から入手できます
見る :
Entity Frameworkクエリが保存されていないエンティティを返さない理由
そして
DbSetに対して直接クエリを実行すると、常にデータベースにクエリが送信されます。 Entity Framework 5 – DbSet.Localプロパティを使用すると、メモリ内データ(自分で作成するか、データベースからロードする)を操作できます。
この記事を見てください: http://msdn.Microsoft.com/en-us/data/jj592872.aspx 。