2009-11-08 3 views
0

새 프로젝트에 대해 LINQ to SQL을 사용하고 있습니다. LINQ 클래스를 내 응용 프로그램에 노출하고 싶지 않습니다. 예를 들어 select in link는 System.Linq.IQueryable < 컬렉션을 반환합니다. 또한 데이터베이스를 나타 내기 위해 생성 된 모든 클래스는 Table, Column, EntityRef 클래스 및 특성을 사용합니다. 내 데이터 액세스 계층에 LINQ 의존성이있는 것은 좋지만 응용 프로그램이 필요하지는 않습니다.LINQ to SQL 클래스를 내 클래스에

그래서 내 데이터 액세스 계층 외부에 노출되지 않는 중간 클래스로 LINQ to SQL 생성 클래스를 사용해야하고 응용 프로그램에서 사용할 수있는 자체 클래스를 만들어야합니다. LINQ to SQL 클래스의 데이터를 자신의 클래스로 가져 오는 가장 쉽고/효과적인 방법은 무엇입니까?

답변

1

전적으로 당신의 생각에 동의합니다. LINQ가 SQL 엔티티에 세계에 직접 노출되는 것을 피하려고합니다.

기본 LINQ to SQL 엔티티의 1 : 1 미러 또는 다른 엔티티 중 자신의 "도메인 모델"을 사용하는 것이 좋습니다.

기본 LINQ to SQL 엔터티와 매우 유사한 도메인 모델이있는 경우 AutoMapper과 같은 도구를 사용하여 LINQ to SQL 엔터티와 도메인 모델 클래스간에 데이터를 쉽게 셔플 할 수 있습니다. 그렇게 쉽게 할 수 있어야합니다!

1

Rob Conery는 MVC-Storefront이라는 제목의 웹 캐스트 시리즈를 게시하여 원하는 것을 수행하는 저장소 패턴의 변형을 소개합니다.

상당히 큰 프로젝트에서 스크린 캐스트의 아이디어를 사용했으며 그 결과에 상당히 만족했습니다.

그러나 패턴에 문제가 있습니다. 특히 패턴을 완전히 커밋하기 전에 병목 현상과 분리 된 시나리오에 대해 생각해 보는 것이 좋습니다.

나는이 패턴 here에서 동시성에 대한 내 고통에 대해 자세히 설명했다.

0

LINQ에서 SQL 클래스로 클래스를 이동하려면 LINQ to LINQ (또는 단일 개체에 대한 초기화)의 문제가 있습니다.

모델에서 LINQ to SQL 개체로 재미가 돌아 오지만 이는 여전히 표준적인 내용입니다. (아직 작업 중이거나 특정 참조를 찾을 수도 있지만).

0

정확하게 똑같은 것을 고려 중이므로 내가받는 응답에 관심이 있습니다. 백엔드에서 L2S 엔티티 클래스를 사용하고 싶지만 애플리케이션 소비를 위해 훨씬 가벼운 엔티티를 사용하고 싶습니다.

랜디

0

이 내가이 일에 대해 갈거야 어떻게 내 현재의 화신 :

나는 디자이너에 테이블을 SQL 클래스에 LINQ를 추가하고 떨어 뜨릴에 의해 생성 된의 DataContext 클래스가 있습니다. 클래스 MyDataContext를 호출하여 Linq라는 네임 스페이스에 넣었습니다. 내 데이터베이스는 Linq 네임 스페이스에서도 클래스를 생성 한 Tag라는 테이블을 가지고 있습니다. 모든 접근자를 내부로 변경 했으므로 데이터 액세스 레이어 외부에 표시되지 않습니다.

namespace Linq 
{ 
    [System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDb")] 
    internal partial class MyDataContext : System.Data.Linq.DataContext 
    { 
     ... 
    } 

    [Table(Name="dbo.vTag")] 
    internal partial class Tag 
    { 
     .... 
    } 
} 

그런 다음 어셈블리를 참조하는 응용 프로그램에 노출 될 DataAccess라는 클래스를 만들었습니다. 나 또한 내 자신의 태그 클래스를 만들었습니다. DataAccess 클래스와 새로운 Tag 클래스는 Linq 네임 스페이스에있는 생성 된 클래스와의 충돌을 피하기 위해 Data라는 다른 네임 스페이스에 있습니다. Linq를 Linq.Tag 객체의 IList를 쿼리하기 위해 Sql에 사용하고 Linq를 사용하여 Linq.Tag 객체의 Data.Tag 객체 목록을 생성합니다.

더 좋은 방법이 있는지, 적은 코드를 필요로하는지에 대해 의견을 듣고 싶습니다. 또한 중복 클래스 이름 (태그)을 사용하여 너무 만족스럽지 않았으므로 추천 이름 지정에 대한 아이디어를 듣고 싶습니다.

namespace Data 
{ 
    public class DataAaccess 
    { 
     public IList<Tag> List_Tags() 
     { 
      using (Linq.MyDataContext dal = new Linq.MyDataContext()) 
      {     
       IList<Linq.Tag> lstTags = (from c in dal.Tags select c).ToList(); 

       return (from tag in lstTags 
         select new Data.Tag() 
          { 
           ID = tag.ID, 
           Name = tag.Name, 
           Parent_ID = tag.Parent_ID 
          }).ToList(); 
      } 
     } 
    } 
} 
0

마이크로 소프트는 새로운 프로젝트에서 LINQ to SQL을 사용하지 말 것을 권고합니다. 마이크로 소프트는이 프로젝트를 더 이상 개발하지 않을 것입니다. LINQ to SQL은 완벽하게 사용할 수 있고 받아 들일 만하지만 새로운 프로젝트를 사용하는 것은 권장하지 않습니다. LINQ to SQL을 좋아한다면 LINQ to SQL 대신 Entity Framework를 사용해야합니다.

+0

나는 이것을 알지 못했고 귀하의 의견을 뒷받침하는 출처를 찾기 위해 인터넷 검색을 실시했습니다. 당신의 코멘트를 확인하는 것 같았던 많은 사람들이 있었지만, 조금 더 통찰력을 제공하는이 것을 찾았습니다. LINQ to SQL은 완전히 사라지지 않을 것입니다. 엔티티 프레임 워크와 병합하여 진화를 계속할 것입니다. http://www.infoq.com/news/2008/11/DLINQ-Future – Jeremy

0

당신이 제안하는 것은 두 개의 분리 된 모델을 가지고 있습니다. 즉, 필자가 발견 한 상용구 코드는 필요하지 않습니다. 나는 너와 거의 같은 생각을 가지고 있지만 이것이 쓸모 없다는 것을 깨달았다. 나는이 스레드에서 또 다른 대답으로 Entity Framework을 제안했으며, 나는이 지점을 다시 여기에서 만들고 싶다.

마지막으로 모델 수프가 있습니다.이 모델 수프에서는 두 모델을 유지하는 대신 모델을 유지해야합니다. 그리고 그것은 절대로 바람직하지 않습니다.

+0

나는 그것에 동의하는 경향이 있습니다. 다소 두 모델 하이브리드,하지만 어떻게 당신이 근본적인 종속성 (linq SQL 또는 엔터티 프레임 워크) 응용 프로그램에 전달되는 제거하는 것이 좋습니다? – Jeremy

+1

AutoMapper (Codeplex의 AutoMapper)와 같은 도구를 사용하면 언제든지 문제를 해결할 수 있습니다. http://www.codeplex.com/AutoMapper –