Entity Framework 코드 우선-Fluent Api 대 데이터 주석의 장단점 [닫힌]


120

Entity Framework 코드 우선을 사용하여 데이터베이스를 만들 때 코드에서 많은 데이터베이스 모델을 추출 할 수 있습니다. Fluent API 및 / 또는 속성을 사용하여 모델을 미세 조정할 수 있습니다.

데이터 주석과 비교하여 Fluent Api의 장점과 단점은 무엇입니까? 즉, 특정 상황에서 두 방법을 모두 사용할 수 있다고해도 어떤 경우에 한 방법이 다른 방법보다 우선해야합니까?


3
아이디어 : 제가 일반적으로하는 일은 POCO로 모델 프로젝트를 만든 다음 Repository 프로젝트에서 EF를위한 새 POCO 세트를 만들고 거기에 주석을 넣는 것입니다. 그런 다음 매퍼 클래스에서 둘 사이를 매핑합니다. 이렇게하면 모델이 그대로 유지되고 필요한 경우 데이터 전략을 쉽게 추가 / 변경할 수 있습니다 (예 : XmlRepository 추가 및 동일한 모델 클래스 사용).
adimauro 2011 년

1
이제 EFCore 및 추가 라이브러리가있는 Annotation을 선호합니다. (더 적은 코드가 필요하며 모두 한곳에 있습니다) github.com/isukces/EfCore.Shaman- 속성 추가 및 확장 github.com/borisdj/EFCore.FluentApiToAnnotation-DB가 이미 존재할 때, 리버스 엔지니어링을 수행하고 CodeFirst
borisdj

답변:


141

DataAnnotations로 구성 할 수있는 모든 것은 Fluent API에서도 가능합니다. 그 반대는 사실이 아닙니다. 따라서 구성 옵션과 유연성의 관점에서 Fluent API가 "더 우수"합니다.

Fluent API에서는 가능하지만 DataAnnotations로는 불가능한 구성 예제 (전체 목록은 아님) (내가 볼 수있는 한) :

  • 계단식 삭제 끄기 :

    .WillCascadeOnDelete(false)

  • 키가 개체 모델에 노출되지 않은 경우 데이터베이스에 외래 키 열 이름을 지정합니다.

    .Map(conf => conf.MapKey("MyForeignKeyID"))

  • 특히 개체 모델에서 연결의 한 쪽만 노출되는 모든 경우에 관계를 세부적으로 조정합니다.

    .WithMany(...), WithOptional(...), WithRequiredDependent(...),WithRequiredPrincipal(...)

  • 개체 모델과 데이터베이스 테이블 간의 상속 매핑 사양 (Table-Per-Hierarchy, Table-Per-Type, Table-Per-Concrete-Class) :

    .Map<TDerived>(Action<EntityMappingConfiguration<TDerived>> ...)

편집 : Microsoft는 Fluent API를 "고급 기능"으로 간주합니다 ( 여기 에서 인용 ).

Fluent API는 더 고급 기능으로 간주되며, 요구 사항에서 Fluent API를 사용해야하는 경우가 아니면 데이터 주석을 사용하는 것이 좋습니다.

그러나 제 생각에는 DataAnnotations의 한계에 매우 빠르게 도달합니다 (아마도 매우 간단한 개체 모델 제외). 더 이상 DataAnnotations로 모델을 미세 조정할 수없는 경우 마지막 수단은 기본 매핑 규칙을 따르는 것입니다 (해당 규칙에 따라 속성 이름 지정). 현재는 규칙을 덮어 쓸 수 없습니다 (비활성화 만 가능합니다. MS는 향후 EF 릴리스에서 규칙에 대한 구성 옵션을 제공한다고 발표했습니다). 그러나 객체 모델을 정의 할 때 매핑 규칙에 의해 강제되는 것을 원하지 않는 경우 유일한 옵션은 Fluent API입니다.

Fluent API를 배우는 것은 거의 필수입니다. DataAnnotations는 간단한 응용 프로그램에 적합합니다.


2
저는이 분야의 초보자입니다. DataAnnotation이 할 수있는 것처럼 Fluent API를 사용하여 사용자 인터페이스를 검증 할 수 있습니까?
내 겨드랑이 키스

27
@CounterTerrorist : 그렇게 생각하지 않습니다. 예를 들면 다음과 같습니다. [Required]ASP.NET MVC 응용 프로그램 의 속성에 특성 을 넣으면 둘 다이 특성을 처리 할 수 ​​있기 때문에 EF MVC에서 유효성 검사 목적으로 사용됩니다. 그러나 MVC는 Fluent API 구성을 이해하지 못합니다. 따라서 속성을 제거하고 HasRequired대신 Fluent API에서 사용하면 EF의 경우 동일하지만 MVC에는 사용되지 않습니다. (내 의견으로는 속성 이름이 다르게 지정되어야한다고 생각합니다. 다른 구성 요소에서 다른 목적으로 DataAnnotations 네임 스페이스를 사용하는 것은 매우 혼란 스럽습니다.)
Slauma

4
또한 [DefaultValue()]Fluent Either에서는 사용할 수 없습니다.
webnoob

4
MinValue는 Fluent API (Programming Entity Framework : Code First)를 통해 정의 할 수없는 속성입니다 (출처 : The Cog에 의해 삭제 된 NAA )
Serge Ballesta 2014

7
아키텍처 관점에서 볼 Fluent API때 구현 논리를 DbContext유지 POCO하고 깨끗하게 유지해야 한다고 생각 합니다
Luke T O'Brien
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.