2009-10-02 3 views
11

엔티티 프레임 워크를 사용하기 위해 응용 프로그램을 다시 작성합니다. 내가 혼란스럽게 생각하는 것은 쓰고있는 코드가 불필요한 tripts를 SQL 서버처럼 만드는 것입니다. 예를 들어, 나는 SO와 비슷한 질문 응답 사이트를 가지고 있습니다. 나는이 질문에 대한 답을 추가 할 때 - 여기 코드는 내가 사용된다Entity Framework에서 데이터베이스에 대한 왕복 이동이 많은 이유는 무엇입니까?

var qu = context.question.where(c => c.questionID == 11).First(); //Database call here 
var answer = new answer(); 
answer.title = "title here"; 
answer.desc = "desc here"; 
answer.question = qu; 
context.SaveChanges(); //Database call here 

은 코드에서 위의 2 데이터베이스를 잘 호출이 있습니까? 그렇다면 질문에 대한 답변을 직접 추가 할 수없는 이유는 무엇입니까?

var ans = answer.Createanswer (0, "title here", "desc here", questionID) 
context.SaveChanges(); 

모든 데이터베이스 호출을 최소화 할 수있는 방법이 있습니까?

+1

좋은 질문 ... –

답변

11

AlexJ http://blogs.msdn.com/alexj/archive/2009/06/19/tip-26-how-to-avoid-database-queries-using-stub-entities.aspx

는 또한이 모든 종종 간단하지에이 ​​간단한 방법을 사용

을 보인다있는 "최적화"의 영역으로 떨어지는 EF 디자이너 중 하나에 의해 설명 된 바와 같이 , SQL은 FK (질문)를로드하고 결과를 캐시하기 위해 읽기 작업을 수행 한 다음 별도의 명령으로 캐시 된 FK 결과를 사용해야하는 삽입 작업을 수행합니다.

첨부 된 FK 메서드를 사용하면 여전히 서버가 FK에 대한 읽기 작업을하는 경우 SQL Server에 왕복하는 횟수가 1 회 줄어 듭니다. 따라서 문제는 증가하는 코드 복잡성보다 왕복 여행 비용이 더 많이 듭니까? 응용 프로그램 및 SQL Server가 동일한 시스템에있는 경우 FK가 크거나 넓은 테이블에 클러스터 된 인덱스가 IO 오버 헤드가 인 경우보다 훨씬 더 많은 수 있습니다 경우

이 오버 헤드는,

또한 매우 작 단지 FK 값에 별도의 표준 지수 - SetEntityKey를 호출 할 때 쿼리 옵티마이 명시 적 을 피하기 위해

-3

할 수는 있지만 .NET 3.5에서는 매우 고통 스럽습니다. 그들은 .NET 4.0에서 훨씬 쉽게 만들었습니다.

8

실제로 관계를 설정하기 위해 질문을로드 할 필요는 없습니다. 대신 엔티티 참조를 사용할 수 있습니다.

예 :

Answer.QuestionReference = new EntityReference<Question>(); 
Answer.QuestionReference.EntityKey 
    = new EntityKey("MyContextName.Question", "Id", questionId); 

나는 개인적으로 그래서 대신 같을 것이다 엔티티 키를

public static void SetEntityKey<T>(this EntityReference value, int id) 
{ 
    value.EntityKey = new EntityKey("ContextName." + typeof(T).Name, "Id", id); 
} 

설정을위한 확장 방법을 사용합니다.

Answer.QuestionReference = new EntityReference<Question>(); 
Answer.QuestionReference.SetEntityKey<Question>(questionId); 
+0

는 사용할 수 없습니다 '이되는 EntityReference ':-) 제대로 작동하는지 가정? – devio

관련 문제