런타임까지 스키마를 알 수없는 데이터베이스에 대해 ORM을 어떻게 활용할 수 있습니까?
문제
다음 요구 사항이 주어지면 ORM을 활용하려고합니다.
1) .net 프레임 워크 사용 (최신 프레임 워크는 괜찮습니다)
2) Sybase, Oracle, MSSQL을 상호 교환 할 수 있어야합니다.
3) 스키마는 대부분 정적이지만 동적 부품이 있습니다.
나는 subsonic 및 nhibernate에 대해 다소 익숙하지만 깊지는 않습니다.
나는 ORM이 내가 원하는 것을 할 수 있다는 잔소리를 느끼지만, 현재 그것을 활용하는 방법을 모르겠습니다.
Subsonic은 현재 Sybase를 지원하지 않기 때문에 최적이 아니며, 내 자신의 공급자를 작성하는 것은 지금 내 자원과 능력을 넘어서는 것입니다.
#3 (위)의 경우 공급 업체가 기존 데이터베이스에 "스테이플을"할 수있는 테이블을 설명하는 메타 데이터 테이블 몇 개가 있습니다.
이것을 부르자 중족기, 그리고 Metafields.
ORM (nhibernate atm)이 잘 처리하는 기본 정적 스키마가 있습니다.
하지만, 공급 업체는 메타 데이터 테이블에 데이터를 추가하여 구조를 설명하는 한 데이터베이스에 테이블을 추가 할 수 있습니다 (물리적으로).
내가 정말로 좋아하는 것은 내가 이해하는 방식으로 ORM을 어떻게 든 "피드"할 수 있고, 그 시점에서 데이터를 조작 할 수있게하는 것입니다.
내 기본 목표 이 동적 테이블에서해야 할 일반 SQL 문 빌딩의 양을 줄이는 것입니다.
또한 SQL의 차이가 Sybase, Oracle 또는 MSSQL로 전송되는 것에 대해 걱정하지 않아도됩니다.
내 기본 문제 메타 데이터에 액세스 할 때 런타임까지 동적 테이블에 대해 Orm을 알리는 방법이 없다는 것입니다.
편집하다: 사용의 예는 하나 일 수 있습니다. 여기에 설명되어 있습니다:
idatareader rdr = new query ( "dynamictable1"). 여기서 ( "ArbitraryId", 2) .Executereader ();
(그러나 Sybase 제공 업체가 없기 때문에 Subsonic이 작동하는 것처럼 보이지 않습니다 (위 참조).
해결책
이 블로그를 사용하면 실제로 사용할 수 있습니다 동적 매핑으로 nhibernate. 그래도 약간의 조정이 필요합니다 ...
다른 팁
우리는 nhibernate를 사용했지만 프로젝트가 우리가 원하는 ROI를 제공하지 않았기 때문에 프로젝트를 중단했습니다. 우리는 결국 우리 자신의 ORM/SQL 레이어를 작성하여 매우 잘 작동했습니다 (더 이상 일하지 않기 때문에 작동했지만 여전히 작동한다고 생각합니다).
우리 시스템은 오픈 소스 프로젝트를 사용하여 SQL을 생성하고 (더 이상 이름을 기억하지 못함) 자체 XML 기반 언어 (쿼리 마크 업 언어 -QML)로 모든 쿼리를 만들었습니다. 그런 다음 Selects, Wheres, Groups 등으로 XMLDocument를 구축 한 다음 SQLENGINE으로 보내 SQL 문으로 전환하여 실행할 수 있습니다. 우리는이 모든 것에서 캐시를 불러 일으키지 만 결코 구현하지 않았습니다. 이를 통해 자주 사용되는 쿼리를 위해 QMLS를 캐시 할 수있었습니다.
나는 런타임에 ORM이 어떻게 사용되는지에 대해 약간 혼란 스럽습니까? ORM이 런타임에 동적으로 무언가를 빌드한다면 런타임 코드는 어떻게 ORM이 동적으로 무엇을했는지 알 수 있습니까?
"그 시점에서 데이터를 조작 할 수있게 해줍니다" - 데이터를 조작하는 것은 무엇입니까?
나는 여기에 무언가를 놓치고있을 수 있으며 그것이 사실이라면 aplogize. (저는 ORM과 함께 상향식 접근 방식 만 사용했습니다)
IdataReader는 당신이 아는 객체에 아무것도 매핑하지 않습니다. 따라서 예제는 클래식 쿼리 빌더를 사용하여 작성해야합니다.
ado.net 엔티티 프레임 워크 사용을 살펴 보셨습니까?
이를 통해 데이터베이스 테이블을 사용중인 데이터베이스 공급 업체에 대해 생각하지 않고 DBA가 실제 테이블에 대한 사소한 변형에 대해 걱정하지 않고 코딩 할 수있는 방식으로 데이터베이스 테이블을 객체 모델에 매핑 할 수 있습니다. 매핑은 재 컴파일없이 DB 테이블을 수정할 때 수정할 수있는 구성 파일로 유지됩니다.
또한 LINQ를 사용하여 엔티티를 사용하면 쿼리를 OO 방식으로 빌드 할 수 있으므로 실제 SQL 쿼리 문자열을 작성하지 않습니다.