2013-10-06 4 views
1

저는 Entity Framework를 사용하여 거대한 프로젝트를 진행하고 있습니다. 거의 모든 엔티티를 시간에 의존적으로 만들었으므로 더 이상 엔티티 간의 관계를 사용할 수 없습니다 (나는 관계를 직접 관리합니다). 문제는 이전보다 더 쉽게 데이터를 쿼리 할 수 ​​없다는 것입니다. Student이라는 엔티티가 있다고 가정 해보십시오. 이 엔티티는 학생에게 속한 Books (목록)의 모음을 포함합니다. 각 책에는 데이터베이스에서 가져온 저자 속성이 포함되어 있습니다. 모든 학생을 자신의 책과 해당 작성자와 함께로드하려면 수백 가지 맞춤 검색어 (f.e. linq)를 작성해야합니다. 그렇지 않으면 결과가 큰 실적에 영향을줍니다. 관계없이 Entity Framework의 Inlude를 사용할 수 있다면 실제로 좋을 것입니다. 아무도 이것을 달성하는 방법을 알고 있습니까? 고맙습니다.Entity Framework 관계없이 포함

답변

3

Entity Framework가 테이블 간의 관계를 관리하지 않으면 SQL 호출에서 조인을 생성하는 .Include()을 사용할 방법이 없습니다. 최선의 선택은 관련된 엔티티를 정상적으로 부모에게 추가하는 것이지만 [NotMapped] 속성을 사용하십시오. 그런 다음 사용자 지정 SQL 호출을 사용하여 조회를 수행하고 필요할 때 속성을 채울 수 있습니다. 그러나 귀하의 진술에 의하면 엔티티가 관계를 사용할 수없는 "시간에 의존"하기 때문에 단순히 데이터베이스의 외래 키일뿐입니다 ... 엔티티를 최적화하기 위해 할 수있는 다른 방법이있을 것입니다. 아이템 간의 관계를 관리하는 경우, DB에서 앱으로 많은 책임을지게됩니다. 이는 이미 많은 작업처럼 보입니다. 감사 트레일을 구현

업데이트

은 아마 훨씬 쉽게 당신의 관계를 관리하는 것보다 엔티티 프레임 워크에서 상당히 표준 프로세스이며,. 감사 추적에는 기본적으로 Context_SavingChanges() 메서드에 대한 이벤트 처리기가 있고 ObjectStateManager을 통해 새 데이터와 이전 데이터로 작업하는 것이 포함됩니다. 이 루프 내에서 논리를 추가하면 특정 시간 프레임에 속하지 않는 추가/업데이트도 무효화되거나 거부 될 수 있습니다.

감사 관리자의 좋은 예는 CodeProject에 있습니다. 저자는 감사 정보를 저장할뿐만 아니라 롤백하는 방법을 보여줍니다.

+0

감사합니다. Andrew! 모든 관계를 제거하기로 결정했습니다. 데이터베이스에 머물기 위해 모든 데이터가 필요하고 시간이 지남에 따라 항목이 다른 값을 가질 수 있기 때문입니다. 또한 엔티티 간의 관계는 특정 시간 범위에서만 유효 할 수 있습니다. 엔티티 프레임 워크 관계를 사용하여 이러한 시스템을 구현하는 방법을 모릅니다. 그런 scenenerio.However 지원하는 것 같아요 관계를 정의하는 추가 매개 변수를 사용하여 사용자 지정 Include 메서드 확장을 작성할 수 있어야합니다 (테이블 (DbSet) 조인을 만들어야하며 외래 키가) 어떻게해야할까요? – sjkm

+0

Entity Framework에서 감사 내역을 구현하는 방법이 있으며 관계의 유효성을 관리하는 것은 쉽습니다 ... 일부 링크로 답변을 업데이트하겠습니다. – Claies

+0

앤드류 감사합니다! 감사합니다. 과거에는 Audit Trail과 함께 작업했지만 이번에는 전체 시스템의 상태를 1 초 이내에 특정 시점으로 변경할 수 있어야했습니다. 즉, 두 개의 다른 시점을 동시에 시뮬레이션 할 수 있어야합니다. [NotMapped] 속성에 대해 더 자세히 알려주시겠습니까? IncludeNotMappedRelation (IQueryable, property, relationToDbSet, foreignKey)이라는 또 다른 메서드로 IQueryable을 확장하려는 노력이 불가능합니까? – sjkm