3

TLDR - 오라클 db, 런타임시 동적 스키마 변경, 일부 테이블에 기본 키가 없으므로, EF와 NHibernate 사이에서 더 좋은 옵션은 무엇인지 알고 있다면 커브 캔트가 너무 길다.NHibernate 대 엔티티 프레임 워크

EF를 사용하여 데이터베이스에서 데이터를 검색하는 MVC 4 응용 프로그램을 작성했습니다. 우리는 테이블의 일부에 기본 키가 없으며 일부 키가 기본 키를 갖지 않으므로 기본 키가없는 테이블에 대해 정기적 인 쿼리를 실행하는 지속성 프로젝트가 있음을이 프로젝트에 알았습니다. 그것은 기본 키 문제를 해결하기위한 우리의 해결책 이었지만 NHibernate는 더 용서하고 기본 키가없는 테이블을 쿼리하기위한 몇 가지 해결 방법이 있다는 것을 읽었습니다. 이 경우인가요?

고객이 로그인 할 때 런타임에 스키마를 변경할 수 있는지 여부에 대한 질문이 제기되었습니다. 각 고객은 동일한 테이블 세트를 갖지만 별도의 스키마가 있습니다. 이는 보안을위한 것입니다. 테이블은 결코 다르지 않으므로 우리는 우리의 poco를 생성하고 dev에 빌드하는 데 사용하는 하나의 "마스터"스키마를 갖게 될 것입니다. 그러나 응용 프로그램이 배포되면 고객이 로그인하므로 각 스키마의 테이블에서만 주문을 검색 할 수 있습니다. 이것은 컨텍스트에서 사용되는 스키마를 변경하여 수행 할 수 있습니다 ... 누군가가 이것을 수행하는 것이 더 좋은 제안이 없다면? 본질적으로 사용자가 속한 고객을 기준으로 사용자가 연결하는 테이블을 변경하려고하지만 솔루션 내부에서 작업 할 때도 모델 디자이너의 모든 항목을보고 poco를 생성 할 수 있습니다.

오라클을 데이터베이스 제공 업체로 사용하고 지금까지 EF와 협력하고 있지만 EF는 써드 파티 툴을 필요로하지만 NHibernate는 오라클과 잘 작동합니다. 오라클 DB를 가지고 있기 때문에 우리는 EF보다 다른 ORM 도구를 사용해야합니까 아니면 EF는 여전히 강력한 도구입니까?

내가 말했듯이, 우리는 이미 EF로 실행되는 조롱 된 응용 프로그램을 가지고 있습니다. 비교적 이해하기 쉽고 이해하기 쉽습니다. 우리가 아키텍처와 백골을 디자인 한 후에 나머지 팀원들이 내 경험에 기반한 EF로 바로 뛰어들 수 있습니다. MVC에서 EF가 작동하는 것을 보여주는 많은 참고 자료와 튜토리얼 프로젝트가 있기 때문일 수 있습니다. 나는 이미 NHibernate에 대한 좋은 문서와 지원을 찾기가 어려웠다. 누구나 문서의 부족으로 인해 좌절감을 느끼고 ORM 도구로 NHibernate에 관한 모든 것을 잊기로 결정했기 때문에 다른 개발자가이를 빨리 배우기가 어려울까요?

ps. 위의 대담한 질문은 내가 지금까지 해결할 수없는 가장 실망스러운 것이었고 NHibernate를 대체 솔루션으로 바라보고있는 나의 원인이다. 런타임에 스키마를 동적으로 변경할 수있는 솔루션을 제안 할 수 있다면 NHibernate에 관한 모든 것을 잊어 버릴 수 있습니다. 그래서 다른 답변을 얻으려면 대담한 섹션을 찾고 있습니다.

+0

스키마가 런타임에 변경되고 기본 키가 결여 된 데이터베이스에서 ORM이 어떻게 효과적 일지는 확실하지 않습니다. tbh. – James

+0

@saluce - (귀하의 링크에서) "제안이 아니라 설명을 구하십시오 : 당신이 성취하고, 배우고, 사고 싶은 것이 무엇인지 구체적으로 설명하십시오. 그러나 그것을 성취하고, 배우고, 선택하는 방법을 묻습니다." 당신은 내가 지금 사용하고있는 특정 기준이나 도구 중 어떤 것이 이상적 일지 물었고, 나의 질문의 대부분은 현재의 문제를 해결하는 방법을 요구하고 있었고, 궁극적으로 NHibernate를 처음부터 살펴 보았다. 나는 두 사람의 제품에 나를 판매 할 영업 사원을 요구하지 않았다. 처음에 찾아보기 시작하게 된 상황에 대한 어떤 언급도하지 않고서. – danmanallen

+0

@ 제임스 - 스키마의 모든 것이 동일하기 때문에 매핑 xml은 바뀌지 않을 것이다. 테이블 레이아웃 및 구조. FK 제약 조건에서 테이블 트리거에 이르는 모든 것이 동일합니다. 유일한 차이점은 테이블 내의 데이터 (고객 별)와 [스키마]입니다. 테이블 이름 앞에 표시됩니다. 이 방법이 데이터 구성에 가장 적합한 방법인지는 모르지만 db 애널리스트가 수행 할 계획이라고 말한 것이므로 런타임에 스키마를 변경할 가능성을 먼저 배제해야합니다. 우리가 가진 좋은 예는 다중 거주자 상황입니다. – danmanallen

답변

2

단어 "스키마"여기에 약간 모호 할 수있는 도움에 미리 감사드립니다. 코드의 전체 매핑 세트 또는 연결 문자열에 지정된대로 oracle 스키마를 참조 할 수 있습니다. 다른 의견으로 인해 나는 후자를 추측합니다.

나는 EF에 대해 많이 논평 할 수 없지만 NHibernate를 사용하면 운이 좋다 : SessionFactory 클래스의 OpenSession() 함수 중 하나가 IDBConnection 객체를 사용한다.

그래서 같이 작업 할 수 있습니다

  • 응용 프로그램 시작에, 당신은 세션 공장을 만들 수 있습니다.응용 프로그램 수준에서 모든 매핑 메타 데이터를 구문 분석하고 캐시합니다.
  • 모든 NHibernate 데이터베이스 작업은 Session 개체를 통해 이루어집니다. 사용자가 로그인하면 모든 요청/응답주기 (또는 action-> view)에 대해 SessionFactory에서 새 세션을 가져옵니다. 대부분의 사람들은 하나의 연결 문자열과 드라이버로 구성된 세션 팩토리를 가지고 있지만, 사용자 고유의 연결 문자열로 연결을 만들고이를 SessionFactory.OpenSession에 전달합니다. 훨씬 더 나아 가기 전에 NHibernate의 "세션을 하나의 작업 단위로"개념을 읽고 세션 관리를 살펴볼 가치가 있습니다.

또한 기존 데이터베이스를 처리 할 때 NHibernate는 매우 유연 할 수 있습니다. 나는 어떤 형태의 키없이 작동 할 수 있다고 생각하지 않는다. (데이터베이스 레코드를 업데이트하는 경우, NHibernate는 DB로부터 레코드에 정확히 액세스 할 필요가있다.) 복합 키를 사용할 수있다.

+0

이 기능에 대해 몇 가지 질문이 있습니다. 사용자가 로그인 할 때 세션이 생성됩니까? 이것은 EF의 xml 생성 이벤트와 같습니까? 가장 많은 시간이 소요되는 응용 프로그램이로드 될 때 한 번만 실행됩니다. 데이터베이스를 호출 할 때마다이 세션을 변경할 수 있습니까? 끝내기까지 너무 오래 걸리겠습니까? 감사합니다 – danmanallen

+0

사용자가 로그인 할 때 세션이 생성 되었습니까? 아니, 완전히 별개의 것입니다. 많은 사람들이 요청 당 세션 패턴을 사용합니다. 요청 시작시 세션을 만들고 요청 끝에서 플러시/종료합니다. – brendanrichards

+0

이것은 EF의 xml 생성 이벤트가 가장 시간이 많이 소요되므로 응용 프로그램이로드 될 때 한 번만 실행됩니까? 세션 팩토리가됩니다. – brendanrichards