source

엔티티 프레임워크와 LINQ 간 SQL 비교

ittop 2023. 6. 1. 22:56
반응형

엔티티 프레임워크와 LINQ 간 SQL 비교

VS2008 SP1과 함께 .NET v3.5 SP1이 출시되었으므로 이제 .NET 엔티티 프레임워크에 액세스할 수 있습니다.

제 질문은 이것입니다.Entity Framework와 LINQ to SQL을 ORM으로 사용할 것인지 결정하려고 할 때 차이점은 무엇입니까?

제가 이해하는 바로는 엔티티 프레임워크(LINQ to Entities와 함께 사용할 경우)가 LINQ와 SQL 사이의 '큰 형제'입니까?이 경우 - 어떤 이점이 있습니까?LINQ to SQL이 자체적으로 수행할 수 없는 작업은 무엇입니까?

LINQ to SQL은 Microsoft SQL Server에서 사용할 수 있는 데이터베이스 테이블, 보기, 스프록 및 함수의 1:1 매핑만 지원합니다.비교적 잘 설계된 SQL Server 데이터베이스에 대한 빠른 데이터 액세스 구성에 사용하기에 좋은 API입니다.LINQ2SQL은 C# 3.0 및 와 함께 처음 출시되었습니다.Net Framework 3.5.

LINQ to Entities(ADO.Net Entity Framework)는 ORM(Object Relational Mapper) API로, 객체 도메인 모델과 다양한 ADO.Net 데이터 공급자와의 관계를 광범위하게 정의할 수 있습니다.따라서 다양한 데이터베이스 벤더, 애플리케이션 서버 또는 프로토콜을 혼합하고 일치시켜 다양한 테이블, 소스, 서비스 등으로 구성된 개체의 집계 매시업을 설계할 수 있습니다.NetFramework는 와 함께 릴리스되었습니다.Net Framework 3.5 SP1.

다음은 MSDN에 대한 좋은 소개 기사입니다.관계형 데이터에 LINQ 소개

제 생각에 빠르고 더러운 대답은

  • LINQ to SQL은 이를 쉽고 빠르게 수행할 수 있는 방법입니다.즉, 더 작은 작업을 수행하는 경우 더 빨리 진행되고 더 빨리 전달됩니다.
  • Entity Framework는 이를 위한 전면적이고 무제한적인 방법입니다.이것은 여러분이 더 큰 것을 작업할 때 사전에 더 많은 시간을 들이고, 더 느리게 발전하며, 더 많은 유연성을 갖게 된다는 것을 의미합니다.

LINQ to SQL True Dead? 저자 조나단 앨런, InfoQ.com

Matt Warren은 [LINQ to SQL]을 "존재해서는 안 되는 것"이라고 설명합니다.본질적으로, 그것은 실제 ORM이 준비될 때까지 LINQ를 개발하는 데 도움을 주는 것으로 되어 있었습니다.

...

Entity Framework의 규모 때문에 .NET 3.5/Visual Studio 2008 마감일을 놓쳤습니다.서비스 팩이라기보다는 메이저 릴리스에 가까운 유감스럽게도 이름이 붙은 ".NET 3.5 서비스 팩 1"에 맞춰 완료되었습니다.

...

개발자는 복잡성 때문에 [ADO.NET Entity Framework]를 좋아하지 않습니다.

...

.NET 4.0 이후, 엔티티에 대한 LINQ는 관계형 시나리오에 대한 LINQ의 권장 데이터 액세스 솔루션이 될 것입니다.

@lars 게시된 기사에는 여러 가지 분명한 차이점이 있지만, 간단한 답변은 다음과 같습니다.

  • L2S는 긴밀하게 연결되어 있습니다. - 특정 데이터베이스 필드에 대한 개체 속성 또는 특정 데이터베이스 스키마에 대한 개체 매핑이 보다 정확합니다.
  • L2S는 SQL Server에서만 작동합니다(제가 알기로는).
  • EF를 통해 단일 클래스를 여러 테이블에 매핑할 수 있습니다.
  • EF는 M-M 관계를 처리합니다.
  • EF는 모든 ADO.NET 데이터 공급자를 대상으로 하는 기능을 보유합니다.

원래의 전제는 L2S는 신속한 개발을 위한 것이고 EF는 더 "엔터프라이즈" n-계층 애플리케이션을 위한 것이었지만, L2S는 조금 부족합니다.

LINQ에서 SQL로

  1. 동종 데이터 소스: SQL Server
  2. 데이터 구조가 잘 설계된 소규모 프로젝트에만 권장
  3. SqlMetal로 재컴파일하지 않고 매핑을 변경할 수 있습니다.exe
  4. .dbml(데이터베이스 마크업 언어)
  5. 테이블과 클래스 간의 일대일 매핑
  6. TPH 상속 지원
  7. 복잡한 유형을 지원하지 않음
  8. 스토리지 우선 접근 방식
  9. 데이터베이스의 데이터베이스 중심 보기
  10. C#팀에서 작성
  11. 지원되지만 추가적인 개선은 의도하지 않음

엔티티 프레임워크

  1. 이기종 데이터 소스:다양한 데이터 공급자 지원
  2. 다음을 제외한 모든 새 프로젝트에 권장:
    • 작은 항목(LINQ에서 SQL로)
    • 데이터 원본이 플랫 파일인 경우(ADO.NET)
  3. 모델 및 매핑 파일을 Copy To Output Directory로 설정할 때 재컴파일하지 않고 매핑을 변경할 수 있습니다.
  4. .edmx(엔티티 데이터 모델)에는 다음이 포함됩니다.
    • SSDL(스토리지 스키마 정의 언어)
    • CSDL(개념 스키마 정의 언어)
    • MSL(매핑 규격 언어)
  5. 테이블과 클래스 간의 일대일, 일대다, 다대일 매핑
  6. 상속 지원:
    • TPH(계층별 표)
    • TPT(유형별 표)
    • TPC(콘크리트 등급별 표)
  7. 복잡한 유형 지원
  8. 코드 우선, 모델 우선, 스토리지 우선 접근 방식
  9. 데이터베이스의 응용프로그램 중심 보기
  10. SQL Server 팀에서 생성됨
  11. 마이크로소프트 데이터 API의 미래

참고 항목:

Entity Framework에 대한 저의 경험은 그다지 훌륭하지 않았습니다.먼저, 당신은 EF 기본 클래스에서 상속받아야 하므로 POCO들에게 작별 인사를 하세요.당신의 디자인은 EF 주변에 있어야 합니다.LinkqtoSQL을 사용하면 기존 비즈니스 개체를 사용할 수 있습니다.또한, 게으른 로딩은 없으며, 당신이 직접 구현해야 합니다.POCO와 Lazy Loading을 사용하기 위한 작업이 있지만, EF가 아직 준비되지 않았기 때문에 IMHO가 존재합니다.4.0 이후에 다시 시작할 계획입니다.

저는 여기서 간단한 단어로 무엇을 사용해야 하는지 설명하는 매우 좋은 답변을 찾았습니다.

기본적으로 프레임워크를 사용하는 방법은 프레젠테이션 계층의 데이터 편집을 계획하는 방법입니다.

  • Linkq-To-Sql - 프레젠테이션 계층에서 데이터의 일대일 관계를 편집하려는 경우 이 프레임워크를 사용합니다.즉, 하나의 보기 또는 페이지에서 둘 이상의 테이블의 데이터를 결합할 계획이 없습니다.

  • 엔티티 프레임워크 - 보기 또는 페이지에서 둘 이상의 테이블의 데이터를 결합하려는 경우 이 프레임워크를 사용합니다.이를 명확히 하기 위해 위의 용어는 단순히 표시되는 것이 아니라 보기나 페이지에서 조작될 데이터에 한정됩니다.이것은 이해하기에 중요합니다.

Entity Framework를 사용하면 표 형식의 데이터를 "합병"하여 편집 가능한 형식으로 프레젠테이션 계층에 표시할 수 있습니다. 그러면 해당 양식이 제출되면 EF는 다양한 테이블의 모든 데이터를 업데이트하는 방법을 알게 됩니다.

L2S보다 EF를 선택해야 하는 더 정확한 이유가 있겠지만, 이것이 가장 이해하기 쉬운 이유일 것입니다.L2S에는 보기 프레젠테이션을 위해 데이터를 병합하는 기능이 없습니다.

Linq2Sq가 당신의 요구에 맞지 않는다면 당신의 데이터베이스는 매우 방대하거나 매우 잘못 설계된 것 같습니다.저는 Linq2Sql을 사용하는 크고 작은 웹사이트를 10개 정도 가지고 있습니다.그리고 Entity 프레임워크를 여러 번 찾아봤지만, Linq2Sql을 통해 사용할 수 있는 좋은 이유를 찾을 수 없습니다.즉, 데이터베이스를 모델로 사용하려고 하기 때문에 모델과 데이터베이스 간의 1대 1 매핑이 가능합니다.

현재 제 직장에는 200개 이상의 테이블이 있는 데이터베이스가 있습니다.불량 솔루션이 많은 오래된 데이터베이스를 사용하여 Linkq2Sql보다 Entity Framework의 이점을 확인할 수 있었지만 데이터베이스가 애플리케이션의 엔진이고 데이터베이스가 잘못 설계되고 속도가 느리면 애플리케이션도 느려지기 때문에 데이터베이스를 재설계하고 싶습니다.이러한 데이터베이스에서 엔티티 프레임워크를 사용하는 것은 불량 모델을 위장하기 위한 빠른 해결책처럼 보이지만 이러한 데이터베이스에서 얻을 수 있는 불량 성능은 결코 위장할 수 없습니다.

LINQ에서 SQL로 엔티티 프레임워크
SQL Server 데이터베이스에서만 작동합니다. Oracle, DB2, MySQL, SQL Server 등과 같은 다양한 데이터베이스에서 작동할 수 있습니다.
관계를 유지하기 위해 .dbml을 생성합니다. 처음에는 .edmx 파일을 생성합니다.이 관계는 .csdl, .msl 및 .ssdl의 세 가지 파일을 사용하여 유지됩니다.
복잡한 유형을 지원할 필요가 없습니다. 복잡한 유형을 지원합니다.
모델에서 데이터베이스를 생성할 수 없습니다. 모델에서 데이터베이스를 생성할 수 있습니다.
엔티티 클래스와 관계형 테이블/뷰 사이의 일대일 매핑만 허용합니다. 엔티티 클래스와 관계형 테이블/뷰 간에 일대일, 일대일, 다대다 매핑이 가능합니다.
DataContext를 사용하여 데이터를 쿼리할 수 있습니다. 엔티티를 사용하여 데이터를 쿼리할 수 있습니다.SQL, 객체 컨텍스트, DBContext
SQL Server를 통해서만 신속한 애플리케이션 개발에 사용할 수 있습니다. SQL Server, Oracle, Postgre와 같은 RDBMS를 사용하여 신속한 애플리케이션 개발에 사용할 수 있습니다.SQL 등

여기서는 Linq2Sq와 EF의 많은 차이점을 다루었지만, 중요한 점은 그다지 주목받지 못했다는 것입니다. Linq2Sq는 SQL Server만 지원하는 반면 EF는 다음과 같은 RDBMS에 대한 공급자를 보유하고 있습니다.

마이크로소프트 제공:

  • SQL 서버, OBDC 및 OLE DB용 ADO.NET 드라이버

타사 공급자를 통해:

  • MySQL
  • 오라클
  • DB2
  • 비스타DB
  • SQLite
  • PostgreSQl
  • 인포믹스
  • U2
  • 사이베이스
  • 시너젝스
  • 불새
  • Npgsql

몇 가지 예를 들자면

따라서 EF는 관계형 데이터 저장소에 대한 강력한 프로그래밍 추상화가 됩니다. 즉, 개발자는 기본 데이터 저장소에 상관없이 일관된 프로그래밍 모델을 사용할 수 있습니다.이는 광범위한 공통 RDBMS와 상호 운용되도록 보장하고자 하는 제품을 개발하는 상황에서 매우 유용할 수 있습니다.

이러한 추상화가 유용한 또 다른 상황은 조직 내에서 다양한 고객 또는 다양한 사업부와 협력하는 개발 팀의 일원인 경우입니다.또한 다양한 RDBMS 위에서 다양한 애플리케이션을 지원하기 위해 익숙한 RDBMS의 수를 줄임으로써 개발자의 생산성을 향상시키고자 합니다.

EF를 사용할 때 동일한 데이터베이스 모델 내에서 여러 데이터베이스를 사용할 수 없습니다.그러나 linq2sql에서는 스키마 이름 앞에 데이터베이스 이름을 붙이기만 하면 됩니다.

이것이 제가 원래 linq2sql로 작업을 시작한 이유 중 하나입니다.EF가 아직 이 기능을 허용했는지는 모르겠지만, 이 기능을 허용하지 않기 위한 것이라고 읽은 것으로 기억합니다.

데이터베이스가 간단하고 단순한 경우 LINQ에서 SQL로 하면 됩니다.테이블 위에 논리적/추상화된 엔티티가 필요한 경우 Entity Framework로 이동합니다.

둘 다 아직 고유한 SQL 2008 데이터 유형을 지원하지 않습니다.제 관점과 다른 점은 향후 릴리스에서 Entity는 여전히 제 지리적 데이터 유형을 중심으로 모델을 구성할 기회가 있으며, 포기된 SQL에 대한 Linkq는 절대 그럴 기회가 없다는 것입니다.

nHibernate 또는 OpenAccess는 어떻게 된 것인지 궁금합니다.

저는 Linq-to-SQL을 사용하는 큰 프로젝트가 있는 고객을 위해 일하고 있습니다.프로젝트를 시작했을 때는 Entity Framework에 몇 가지 주요 기능이 부족했고 Link-to-SQL의 성능이 훨씬 더 뛰어났기 때문에 이는 명백한 선택이었습니다.

이제 EF가 발전했고 Linq-to-SQL은 비동기식 지원이 부족하여 확장성이 높은 서비스에 적합합니다.때때로 초당 100개 이상의 요청이 있으며 데이터베이스를 최적화했음에도 불구하고 대부분의 쿼리를 완료하는 데 몇 밀리초가 걸립니다.동기식 데이터베이스 호출로 인해 스레드가 차단되어 다른 요청에 사용할 수 없습니다.

우리는 이 기능만을 위해 엔터티 프레임워크로 전환하는 것을 고려하고 있습니다.Microsoft가 Linkq-to-SQL에 비동기 지원을 구현하지 않은 것은 유감스러운 일입니다.

부록 2018년 12월: Microsoft는 .NET Core로 전환하고 있으며 Linq-2-SQL은 .NET Core에서 지원되지 않으므로 EF로 마이그레이션하려면 EF로 전환해야 합니다.미래의 핵심.

LLBLGen과 같이 고려해야 할 몇 가지 다른 옵션도 있습니다.이미 오래전부터 존재하고 MS 데이터 솔루션(ODBC, ADO, ADO.NET, Linq-2-SQL, EF, EF.core)보다 미래에 대비한 것으로 입증된 성숙한 ORM 솔루션입니다.

중간에 이상한 것이 없는 빠른 것을 개발해야 하고 테이블을 대표하는 엔티티가 필요한 경우:

Linq2Sq는 좋은 제휴 관계가 될 수 있으며, LinQ와 함께 사용하면 훌륭한 개발 타이밍을 제공합니다.

Linkq-to-SQL

공급자는 SQL Server만 지원합니다.SQL Server 데이터베이스 테이블을 .NET 개체에 매핑하는 매핑 기술입니다.ORM - 객체-관계형 매핑기에 대한 Microsoft의 첫 번째 시도입니다.

링크-엔티티

동일한 생각이지만, 백그라운드에서 Entity Framework를 Microsoft의 ORM으로 사용하여 여러 데이터베이스를 지원합니다. 엔티티 프레임워크의 주요 장점은 개발자가 다른 데이터베이스에서 작업을 수행하기 위해 구문을 배울 필요가 없다는 것입니다.

제 개인적인 경험에 따르면 Ef가 더 낫습니다(SQL에 대해 전혀 모르는 경우). Lambda로 작성된 EF reason LINQ 언어에 비해 LINQ의 성능이 조금 더 빠릅니다.

여기 몇 가지 측정 기준이 있습니다.(물건 수량화!!!!)

Entity Framework를 사용할 때 이 쿼리를 받았습니다.

var result = (from metattachType in _dbContext.METATTACH_TYPE
                join lineItemMetattachType in _dbContext.LINE_ITEM_METATTACH_TYPE on metattachType.ID equals lineItemMetattachType.METATTACH_TYPE_ID
                where (lineItemMetattachType.LINE_ITEM_ID == lineItemId && lineItemMetattachType.IS_DELETED == false
                && metattachType.IS_DELETED == false)
                select new MetattachTypeDto()
                {
                    Id = metattachType.ID,
                    Name = metattachType.NAME
                }).ToList();

그리고 제가 저장소 패턴 린크를 사용하는 이것으로 변경했습니다.

            return await _attachmentTypeRepository.GetAll().Where(x => !x.IsDeleted)
                .Join(_lineItemAttachmentTypeRepository.GetAll().Where(x => x.LineItemId == lineItemId && !x.IsDeleted),
                attachmentType => attachmentType.Id,
                lineItemAttachmentType => lineItemAttachmentType.MetattachTypeId,
                (attachmentType, lineItemAttachmentType) => new AttachmentTypeDto
                {
                    Id = attachmentType.Id,
                    Name = attachmentType.Name
                }).ToListAsync().ConfigureAwait(false);

Linkq-to-sql

            return (from attachmentType in _attachmentTypeRepository.GetAll()
                    join lineItemAttachmentType in _lineItemAttachmentTypeRepository.GetAll() on attachmentType.Id equals lineItemAttachmentType.MetattachTypeId
                    where (lineItemAttachmentType.LineItemId == lineItemId && !lineItemAttachmentType.IsDeleted && !attachmentType.IsDeleted)
                    select new AttachmentTypeDto()
                    {
                        Id = attachmentType.Id,
                        Name = attachmentType.Name
                    }).ToList();

또한, Linq-to-Sql이 Linq보다 14배 빠르다는 것을 알아두시기 바랍니다...

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/8676/entity-framework-vs-linq-to-sql

반응형