15

.NET 3.5 SP1에서 EF 백을 사용해 보았습니다. 나는 좌절감을 느끼고 SQL 대신 LINQ를 배우기로 결정한 많은 사람들 중 한 명이었습니다. 이제는 EF가 "선택된"경로이며, EF 4.0에는 몇 가지 흥미로운 새로운 기능이 추가되었으므로 내 앱을 EF 4.0으로 마이그레이션하고 싶습니다.LINQ에서 SQL로 Entity Framework 4.0으로 마이그레이션 - 팁, 문서, 기타

누구나 구체적으로 4.0 L2S 마이그레이션을 목표로하는 좋은 리소스를 제안 할 수 있습니까? 참고 : .NET 3.5에서 L2S에서 EF로 마이그레이션하는 것과 관련하여 많은 블로그와 기사를 찾을 수 있지만, 많은 사람들이 분명히 날짜를 기입하고 4.0을 사용하는 사람에게 도움이되지 않았던 것처럼 느낍니다.

나는 내가 얻을 수있는만큼 깊고, 보잘것없는 것들을 정말 좋아할 것이다. 나는 정말로 내가 떨어져있는 것처럼 느껴지고 싶다 EF 4.0 내가 현재 L2S 3.5를 알고있는 방법.

TIA!

답변

19

나는이 매우 많은 변환 유형과 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()를 사용하는 것을 기억하는 것보다이 작은 문제가 더 큰 문제가되었습니다.

0

이 부분은 conversion template입니다. 베타 1 (2010)입니다. 더 새로운 버전이 아닌 것 같습니다. Mabe를 사용하면 RTM과 함께 작동하도록 변경할 수 있습니다.

직접 사용하지 않았습니다.

4

EF 코드 첫째, 대부분 리버스 엔지니어링에 대한 존재입니다 g 테이블을 EF 클래스로 변환합니다. EF 전동 공구는 지금 당신을 위해이 작업을 수행합니다

http://msdn.microsoft.com/en-us/data/jj200620.aspx

나머지는 SQL을 대신 LINQ의 데이터베이스에 얘기를 그 생성 된 클래스를 사용하도록 기존 코드를 수정하는 명백한 일이다.

+0

미래의 독자를 위해, 나는이 대답에 뒤이어 거의 고통없이이 작업을 수행 할 수있었습니다. 유일하게 진짜 문제는 당신이 당신의 질의를 다시 써야하는 수동 부분이지만, 그렇게 나쁘지는 않습니다. – joshmcode

관련 문제