나는이 매우 많은 변환 유형과 FWIW를 수행 했으므로 차이점보다 더 많은 유사점이 있다고 말할 수 있습니다. 나는
http://msdn.microsoft.com/en-us/library/ex6y04yf(VS.100).aspx
난 당신이 더 명백하다 제공 할 수 있습니다 무엇 ... 당신이 거기 이미 물건을 넘어, EF4의 전문가처럼 느끼게됩니다 어떤 명확한 문서가 있다고 생각하지 않습니다 "잡았다." 특히 Linq2Sql은 비즈니스 계층과 데이터 계층을 훨씬 더 분명하게 결합하려고했습니다. 정말로 자신 만의 부분 수업을 만들도록 강요했습니다. 나는 계속해서 나아갈 수 있지만 가장 구체적인 이유는 일대일 매퍼가 모든 관계에 대해 공개 부모 및 자식 속성을 만드는 방식입니다.
이 모델에 대해 모든 유형의 직렬화를 사용하려고하면 Linq2Sql 직렬화 동작에 모든 자식이 자동으로 포함되므로 직렬 변환기가 부모에서 자식으로 이동 한 후 다시 부모로 돌아갈 때 순환 참조 문제가 발생합니다. 그래프에서. 고객 레코드를 가져 와서 "이름"속성을 확인하고 그래프에 포함 된 모든 관련 주문 레코드를 자동으로 가져 오려고하면이 작업이 정말 짜증나게됩니다. 이러한 부모 및 자식 탐색 속성을 "public"또는 "internal"로 설정할 수 있습니다. 즉, 액세스하려는 경우 serializer가 순환 참조를 자동으로 만들지 않게하려면 부분적으로 액세스해야합니다. 수업.
부분 클래스 경로를 시작한 후에는 일반적으로 패턴을 계속 진행하고 결국에는 개별 엔터티 클래스에 데이터에 액세스하기위한 도우미 메서드를 추가하기 시작합니다. 또한 Linq2Sql DataContext가 더 가볍기 때문에 사람들의 상황에 맞는 일종의 Singleton 패턴이나 Repository 패턴을 사용하는 사람들을 종종 볼 수 있습니다. EF 3.5/4에서는이 점이 많이는 보이지 않습니다.
설명 된 환경과 비슷한 환경에서 변환을 시작한다고 가정 해 보겠습니다. 음, DataContext가 생성/삭제 될시기를 알아야합니다. 어떤 사람들은 using() 문을 사용하여 각 Business Layer 메소드를 시작하고 메소드의 수명 동안 컨텍스트를 거의 그대로 유지합니다. 분명히 이것은 여러분이 질문의 끝 부분에 .ToList() 또는 다른 확장 메서드를 추가해야하는 털이 많은 상황에 빠질 수 있음을 의미합니다. 자식 메서드 또는 기타에 전달할 개체의 전체 메모리 내 컬렉션을 가질 수 있습니다. 원래 검색되지 않은 컨텍스트에서 엔터티를 업데이트하려고 시도 할 때 문제가 발생할 수 있습니다.
또한 Linq2Sql 부분 클래스에 통합 된 BusinessLogic의 많은 부분이 데이터 조작을 명시 적으로 처리하지 않으면 다른 계층으로 어떻게 밖으로 나가야하는지 알아야합니다. 컨텍스트가 필요하거나 필요하지 않을 때 알아낼 수는 있지만 고통스럽지는 않지만 최선의 방법입니다.
다음으로 개체 그래프 상황을 처리하는 것이 좋습니다. 게으른 로딩 방식의 차이점 (EQ 4.0에서이 기능을 구성하여 원하는 사람들을 위해 Linq2Sql처럼 동작하도록 만들었 기 때문에) Linq2Sql의 그래프에서 자식 개체의 암시 적 사용을 확인해야 할 것입니다 구현에서 그래프에 자식 객체를 가져 오기 위해 명시 적으로 .Include() 또는 .Load()가 필요하지 않음을 확인합니다.
마지막으로 직렬화 솔루션을 결정해야합니다. 기본적으로 EF 모델의 일부로 생성 된 DataContracts 및 DataMember 특성은 WCF와 함께 훌륭하게 작동하지만 이전 .asmx WebServices와 같은 것에 사용되는 XmlSerializer에서는 전혀 작동하지 않습니다. 이 상황에서도 유선을 통해 자식 객체를 직렬화 할 필요가 없다면 그걸로 도망 갈 수있을 것입니다. 일반적으로 그런 것이 아니기 때문에 더 많은 SOA가 있다면 WCF로 옮기고 싶을 것입니다. 그러면 완전히 새로운 호스트가 추가되지만 두통이 생길 것입니다.
부분적인 클래스 상황과 무거운 DataContext 및 직렬화 문제를 처리하기 위해 EF 4.0에서 사용할 수있는 많은 새로운 코드 생성 템플릿이 있습니다. POCO-Entity 템플릿에는 예상대로 POCO 클래스를 만들 때 많은 사람들이 흥분합니다 (문제는 WCF 등의 클래스 또는 멤버 특성 제외). 또한 셀프 추적 엔티티 모델은 컨텍스트 문제를 거의 해결합니다. 엔티티를 전달할 수 있고 업데이트 된 시간과 방법을 기억할 수 있으므로 Linq2Sql과 같이 컨텍스트를 훨씬 더 자유롭게 생성/삭제할 수 있습니다. 또 다른 보너스로,이 템플릿은 WCF 또는 RIA Services 나 WCF Data Services와 같은 WCF를 기반으로하는 템플릿을위한 템플릿이므로 [DataContract], [DataMember] 및 [KnownType] 특성은 이미 알아 냈습니다.
(편집 : 나는 두 개의 하이퍼 링크를 게시 할 수 없으므로 visualstudio 갤러리 웹 사이트를 방문하여 "ADO.NET C# POCO Entity Generator"를 검색하십시오.)
이 문제를 구현하는 방법에 대한 자세한 내용은 ADO.net 팀 블로그의 링크를 참조하십시오. WebService 대 WCF Service 범주에 속한다면 컨텍스트와 엔티티를 별도의 프로젝트/어셈블리로 분할하는 것에 대해 조금은 마음이들 수도 있습니다. "Add Service Reference ..."프록시 생성은 "웹 참조 추가 ..."와 동일한 방식으로 네임 스페이스를 수행하지 않으므로 클라이언트 응용 프로그램에서 실제로 엔터티 클래스 어셈블리를 참조하여 " 참조 라이브러리의 유형 "또는 서비스 참조의 내용을 참조하십시오. 따라서 동일한 EF 모델을 사용하고 해당 엔티티를 노출하는 여러 서비스에서 모호한 참조를 많이 얻지는 않습니다.
이 내용은 길고 번거롭지만, context.SubmitChanges() 대신 context.EntityCollection.AddObject() 대신 context.EntityCollection.InsertOnSubmit() 및 context.SaveChanges()를 사용하는 것을 기억하는 것보다이 작은 문제가 더 큰 문제가되었습니다.
미래의 독자를 위해, 나는이 대답에 뒤이어 거의 고통없이이 작업을 수행 할 수있었습니다. 유일하게 진짜 문제는 당신이 당신의 질의를 다시 써야하는 수동 부분이지만, 그렇게 나쁘지는 않습니다. – joshmcode