2010-05-07 2 views
4

조직에서 Entity Framework 사용을 조사하고 있습니다. 우리는 오라클 DBMS를 사용하므로 좋은 (또는 좋지 않음) 오라클에서 일반적인 "의사 부울 (pseudo-boolean)"패턴을 사용하고 있습니다. 오라클에는 존재하지 않는 부울 열 대신에 1 문자 열 제약 조건을 "Y"또는 "N"으로 강제합니다.오라클 가상 부울이있는 Entity Framework 사용

내 EF 모델의 엔티티에서 부울 속성을 갖기를 원하면 true로 "Y"로, false로 N으로 데이터베이스 열을 매핑하는 방법은 무엇입니까? 이 작업을 수행 할 "Converters"개념이나 Entity Framework의 개념이 있습니까?

아마 올 것이기 때문에 EF는 SQL Server에서만 작동한다는 것을 알고 있습니다. Oracle 용 DevArt dotConnect를 사용하여 Oracle에서 EF를 사용할 것입니다.
http://www.devart.com/dotconnect/oracle/

편집
무엇 NHibernate에 같은 다른 ORM 프레임 워크는 어떻습니까? 그들은이 시나리오를 "즉시"처리합니까?

답변

3

오라클 용 dotConnect는 NUMBER (1) 열을 System.Boolean에 자동 매핑하므로 이러한 열을 사용하여 작업을 단순화합니다. 0은 거짓, 0이 아닌 값 (기본값은 1)에 해당합니다. 추가 조치가 필요하지 않습니다.
boolean 값을 char 형식으로 유지하려면 다음 방법 중 하나를 선택해야합니다.
1. 문자 열에 매핑 된 속성의 문자열 유형을 그대로 둡니다. 부분 엔티티 클래스에 부울 유형의 추가 래퍼 등록 정보를 추가하고 getter 및 setter에서 문자열 값을 부울로 또는 그 반대로 변환합니다.
단점 :이 래퍼 속성은 LINQ to Entities에서 사용할 수 없습니다.
2. 문자 열의 값 대신 0 또는 1을 반환하는 테이블의 뷰를 만듭니다. 또는이 EntitySet에 대한 모델에서 DefiningQuery를 만듭니다 (이 경우 데이터베이스에 추가하면 안 됨). 대부분의 경우 SSDL에서는 속성의 유형을 "char (1)"에서 "bool"로 변경하고 CSDL에서는 System.String에서 System.String으로 변경해야합니다. 엔터티와 함께 ​​CUD 작업을 실행하고이 엔터티를 업데이트 할 수 있도록 이러한 프로 시저를 매핑하는 일련의 저장 프로 시저를 작성해야합니다.
단점 : 많은 작업이 필요합니다.

+0

응답 해 주셔서 감사합니다. 이 두 옵션을 모두 고려했지만 VARCHAR (1)과 마찬가지로 NUMBER (1)에 대해 동일한 처리 방법을 찾기를 희망했습니다. 이러한 옵션의 단점은 우리에게 중요합니다. 그리고 VARCHAR (1) 메소드를 사용하는 100 개의 테이블이있는 NUMBER (1)을 사용하는 것으로 변경할 수는 없습니다. – RationalGeek

1

오라클의 공식 EDM-EF 매핑은 없습니다. DevArt와 DataDirect는 구입할 수있는 사용자 정의 Oracle 연결 제공자 계층을 가지고 있습니다. CodeProject에는 EF/ODM 용 EDM을 구현하는 유사 오픈 소스 버전이 있습니다. 나는 당신이 이것들 중 하나를 사용하고 있다고 추정한다.

질문에 대답하기 위해 GetEdmType() 호출에서 적절한 .NET 유형을 반환하도록 ProviderManifest 구현을 변경해야합니다. 문제는이 메서드가 Oracle 형식을 전달하고 EF에서 이해하는 .NET 형식 (bool을 비롯한 모든 기본 요소를 이해함)을 반환 할 것으로 기대한다는 것입니다. 불행하게도 CHAR(1)을 부울로 매핑하는 것은 바람직하지 않습니다. 다른 CHAR(1) 열이 이 아니고 bool 일 수 있습니다.

이 문제에 대한 해결 방법은이 CHAR(1)에 매핑되고, oracle user-defined type (JKBOOL를 만드는 것입니다 :) 말할 수 - 당신이 다음 JKBOOLCHAR(1)을 변경하려면 테이블을 변경해야합니다. 이제 JKBOOLSystem.BooleanGetEdmType()에 안전하게 매핑 할 수 있습니다.

+0

재미있는 일이지만 Oracle에서 사용자 정의 유형을 만들고이를 CHAR (1) 대신 사용하면 DevArt의 EF 공급자가 이미 bool에 올바르게 매핑 한 bool을 나타내는 데 NUMBER (1)을 사용할 수 있습니다. . – RationalGeek

+1

차이점은 UDT는 SQL 또는 PLSQL 코드에 의해'CHAR (1) '로 취급 될 수 있다는 것입니다. 왜냐하면 UDT는 해당 유형의 별칭이기 때문입니다. 열을 'NUMBER'로 변경하면 큰 변화가 생길 것이며 어떤 쿼리, 패키지 및 뷰가 영향을 받는지 분석해야합니다. – LBushkin

+0

아. 이제 네가하는 말을 보았다. 나는이 가능성을 분명히 들여다 보겠다. 정보 주셔서 감사합니다. – RationalGeek