2011-03-29 2 views
1

Oracle 또는 SQL Server 데이터베이스에 배포 할 수있는 시스템에 Entity Framework 모델을 생성했습니다. 나는 EF 모델이 DB의 두 가지 (나는 공통의 CSDL 인 Oracle SSDL과 SQL Server SSDL을 가지고있다.)와 함께 작업 할 수 있었다. 정수에 문제가 있습니다. SQL Server에서 필드는 정수로 정의 될 수 있지만 오라클에서는 최대 정수가 유지 될 수 있도록 숫자 (10,0)로 정의됩니다.Entity Framework의 Oracle 및 SQL Server 모두 지원

EF는 SQL Server 모델에서는 Int32를 생성하지만 Oracle에서는 Int64를 생성합니다. 나는이 모든 필드를 Int64로 만들기 위해 CSDL을 변경해 보았습니다. 이것은 오라클에서는 잘 작동하지만 SQL Server에서는 그렇지 않습니다. 또한 SQL Server ssdl을 변경하여 해당 필드를 bigints로 만들었습니다.

은 내가 'INT32' 값으로 설정할 수 없습니다 '테이블 이름'에 다음과 같은 오류

'PROPNAME'속성을 얻을. 당신은 'INT64'유형의 null이 아닌 값이 속성을 설정해야합니다

나는 SQL 서버 DB에 INT 필드에 BIGINT에 할당 할 수 있다고 생각했을 것이다

은/INT64은의 기회가 없기 때문에 데이터 손실.

내 통제 범위를 벗어난 DB 구조를 변경하지 않고이 문제를 해결하는 방법에 관해서는 누구나 아이디어가 있습니까?

감사합니다.

+0

linq-to-entities 쿼리에서이 오류를 이미 보았습니다. EF는 암묵적인 변환을 어떻게 든 처리하지 않으므로 어디에서나 긴 값을 사용해야합니다. –

답변

0

아마도 이것은 답 유형이 아닙니다. POCO 개체 생성 템플릿 중 하나를 사용하면이 문제를 해결할 수 있습니다 (EF 4.0의 추가 기능으로 제공되며 4.1에 포함됨). RC). 이렇게하면 데이터에 대한 가벼운 부분 클래스가 생성됩니다.

이 클래스는 부분 클래스이므로이 문제가있는 부분 클래스에 추가 할 자체 부분 클래스를 만들어이 문제를 해결할 수 있습니다. 새 속성을 만듭니다 (이 예제에서는 "PropName2"라고 부르지 만 분명히 큰 이름은 아닙니다). 즉 int입니다. SQL Server 버전의 데이터 계층에서는 누군가가 새 속성을 사용할 때 일반 propName 속성을 직접 가져 오거나 설정해야합니다.

오라클 버전에서는 새로운 속성에서 Int64 항목을 숨길 수 있습니다. 따라서 사용자는 새로운 속성을 사용하고 Int32를 얻습니다.

각 데이터베이스에 대한 클래스 버전이 필요하기 때문에 이상하지 않다는 것을 알고 있지만 나머지 코드에서 문제를 효과적으로 숨길 수 있습니다.

1

Oracle에 대한 올바른 Int32 매핑은 NUMBER (9,0)입니다.