나는 최근에 엔티티 프레임 워크 4와 함께 일하고있다, 약간 사용하는 경우에 관한 혼란 스러워요 ObjectSet.Attach 및 ObjectSet.AddObject을 .
내 이해에서 :
- 엔티티가 시스템에 이미 존재하는 경우 "첨부"를 사용하십시오.
- 새로운 엔터티를 만들 때 "AddObject"사용
따라서 새로운 Person을 만드는 경우이 작업을 수행합니다.
var ctx = new MyEntities();
var newPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.AddObject(newPerson);
ctx.SaveChanges();
기존 Person을 수정하는 경우 다음을 수행하십시오.
var ctx = new MyEntities();
var existingPerson = ctx.Persons.SingleOrDefault(p => p.Name = "Joe Bloggs" };
existingPerson.Name = "Joe Briggs";
ctx.SaveChanges();
명심하십시오. 이것은 매우 간단한 예입니다. 실제로는 순수 POCO (코드 생성 없음), 리포지토리 패턴 (ctx.Persons를 처리하지 않음) 및 작업 단위 (ctx.SaveChanges를 처리하지 않음)를 사용하고 있습니다. 그러나 "표지 아래"에서 위의 구현에서 발생합니다.
이제 내 질문 -아직 Attach 를 사용해야하는 시나리오를 찾지 못했습니다 .
내가 여기서 무엇을 놓치고 있습니까? 언제 첨부를 사용해야합니까?
편집하다
명확히하기 위해 AddObject를 통해 Attach를 사용하는 경우 (또는 그 반대)의 예 를 찾고 있습니다.
편집 2
아래 답변은 정확하지만 (허용됨) Attach가 유용한 다른 예를 추가한다고 생각했습니다.
위 의 기존 Person 수정 예제에서는 실제로 두 개의 쿼리가 실행되고 있습니다.
하나는 Person (.SingleOrDefault)을 검색하고 다른 하나는 UPDATE (.SaveChanges)를 수행합니다.
(어떤 이유로 든) 시스템에 "Joe Bloggs"가 존재한다는 것을 이미 알고 있다면 왜 먼저 추가 쿼리를 수행해야합니까? 나는 이것을 할 수있다 :
var ctx = new MyEntities();
var existingPerson = new Person { Name = "Joe Bloggs" };
ctx.Persons.Attach(existingPerson);
ctx.SaveChanges();
이로 인해 UPDATE 문만 실행됩니다.