2011-07-05 18 views
4

2つのEntitySets、 "Teams"と "Players"があるとします。ObjectSet <T> .AddObject()とEntityCollectionの比較 .Add()

私はシステムに新しいチームを追加しています。議論のために、ファイル(重複を含む)から千チームを追加しています。

システムには100個のチームが含まれています。私の目標は、追加されたすべてのチームに対してSaveChanges()を呼び出さずに重複を避けることです。

このプロセスでは、newteamが存在しないことを照会し、存在しない場合は新しいチームを追加します。

var team = (from t in context.Teams 
    where t.Name == newTeam.Name 
    select t).FirstOrDefault(); 

if (team==null) 
--Add New Team 

私はcontext.Teams.AddObject(newTeam);またはcontext.AddObject("Teams",newTeam);

team.Countを(使用して追加した場合)は100のままになり、再びクエリを実行した場合、VARチームはnullになります。

しかし、代わりにplayer.Teams.Add(newTeam);を使用してチームを追加すると、NewTeamを追加するプレイヤーが必要な場合を除き、すべてが完全に機能します。そのプレーヤーはすべての新しいチームのメンバーになります。

player.Teams.Add(newTeam); 呼び出し後、新しいチームが返されます。

var team = (from t in player.teams 
where t.Name = newTeam.Name 
select t).FirstOrDefault(); 

player.Teams.Count()が1つ増加します。

最初の例context.TeamsはObjectSet<T>,ですが、player.Teams.AddチームではEntityCollection<T>です。私はこれらが同じように振舞うと思うだろうが、そうではない。

ObjectSet<T>EntityCollection<T>のように動作する方法がありますか?すべてのチームがファイルから追加された後、SaveChangesを1回だけ呼び出す必要があります。

また、私が見ていないより良い方法がありますか?

ありがとうございます!

+0

offtopic:ヌルチェック – Jowen

答えて

6

いいえ同じように動作させる方法はありません。 ObjectSetはデータベースクエリを表し、一度使用すると、新しいチームがまだ存在しないデータベースに対して常にクエリを実行しています。 EntityCollectionはロードされたエンティティのローカルコレクションであり、使用している場合はアプリケーションメモリに対してクエリを実行しています。一般EntityCollectionを使用して

は別々のList<Team>の維持とまったく同じである:

List<Team> teams = context.Teams.ToList(); 

var team = teams.FirstOrDefault(t => t.Name == newTeam.Name); 
if (team == null) 
{ 
    context.Teams.AddObject(newTeam); 
    teams.Add(newTeam); 
} 

context.SaveChanges(); 

またDictionary<string, Team>を使用して、各チームのリストを検索するのではなく、おそらくより良いパフォーマンスを得ることができます。

+1

に代わりFirstOrDefaultのいずれか()を使用して明確化をありがとうございました。それは私がやらなくてはならないと思ったものですが、EntityFrameworkですべてをやってみて、別のList を維持しようとはしていませんでした。好奇心の漂うEF4のコレクションの違いをすべて詳しく説明していますか?再度、感謝します。 – CkH

0

"私はcontext.Teams.AddObject(newTeam)を使用して追加した場合、またはcontext.AddObject(" チーム」、newTeamを);

team.Count()再度クエリを実行した場合は100のままとなります、varチームはnullになります。 "

SaveChanges()メソッドを呼び出すまで、チームは追加されません。

Playerテーブルのナビゲーションプロパティを追加すると、実際にはSaveChanges()メソッドが呼び出される前にチームテーブルに書き込まれていると思います。

私はすべての新しいチームをリストに入れて、そのリスト上で別名を実行することを検討します。たぶん、このような何か...

//an array of the new teams 
var newTeams = {"Chi","Cle","La","Ny"}; 

//a list of the teams in the database 
var teamsInDb = context.Teams.ToList(); 

//a query to get the unique teams that are not in the database 
var uniqueTeams = newTeams.Where(t => !teamsInDb.Contains(t)).Distinct(); 

//iterate the new teams and add them 
foreach(var t in uniqueTeams) 
{ 
    context.Teams.AddObject(t); 
} 

//save 
context.SaveChanges(); 
+0

実際には、変更はSaveChangesが呼び出されるまでEntityCollectionのメモリに保存されます。最初のクエリが実行されたときにデータベースへの呼び出しは1回だけで、プレーヤーオブジェクトをメモリにロードします。私はいくつかの楽しいTDDテストを通してこれをすべて学びました。これは私にこの質問につながります。 – CkH

関連する問題