2011-07-05 3 views
4

두 개의 EntitySets, "Teams"및 "Players"가 있다고 가정 해 보겠습니다.ObjectSet <T> .AddObject() vs. 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 

내가 100을 유지하고 당신이 쿼리를 다시 실행 한 경우, VAR 팀은 null이 될 것이다)

context.Teams.AddObject(newTeam); 또는 context.AddObject("Teams",newTeam);를 사용하는 team.Count (추가하는 경우.

그러나 팀을 추가하는 대신 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 Teams는 EntityCollection<T>입니다. 나는 이것들이 똑같이 행동 할 것이라고 생각 하겠지만, 그들은 그렇게 행동하지 않을 것이다.

ObjectSet<T>EntityCollection<T>처럼 동작합니까? 모든 팀이 파일에서 추가 된 후에 한 번만 SaveChanges를 호출하려고합니다.

아니면 내가 볼 수없는 더 좋은 방법이 있습니까?

감사합니다.

+0

: 널 체크 – 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>를 사용하고 각 팀에 대한 목록을 검색하는 대신 아마 더 나은 성능을 얻을 수 있습니다. "(팀", newTeam) 또는 context.AddObject 내가 context.Teams.AddObject (newTeam)를 사용하여 추가 할 경우 ";

+1

되어있는 모든() 대신에 FirstOrDefault의 사용은 설명 주셔서 감사합니다. 그것이 내가해야 할 것이라고 생각한 것이지만, EntityFramework로 모든 작업을 수행하고 별도의 List 을 유지하려고 시도하지 않았습니다. 호기심에서 EF4의 모든 컬렉션의 차이를 자세히 설명하는 링크가 있습니까? 다시 한번 감사드립니다. – CkH

0

다시 쿼리를 실행 한 경우

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의 메모리에 저장됩니다. 플레이어 개체를 메모리에로드하는 첫 번째 쿼리가 수행 될 때 데이터베이스에 대한 호출이 하나뿐입니다. 재미있는 TDD 테스트를 통해이 모든 것을 배웠습니다. 어느 것이이 질문에 나를 인도합니다. – CkH

관련 문제