2011-10-29 4 views
0

레거시 POCO 모델로 레거시 데이터베이스를 매핑하려고합니다. Entity Framework를 염두에두고 개발하지 않은 데이터베이스와 모델에는 그 사이에 약간의 차이점이 있습니다.Entity Framework 코드 우선 - nullable이 아닌 형식의 기본값

제가 직면 한 과제는 가능한 한 덜 침략 적으로 작동하도록 만들고 싶습니다 (데이터베이스의 코드 나 모델을 터치하고 싶지 않음). 의존하는 코드가 너무 많기 때문입니다.

레거시 모델에서 POCO를 다시 사용하여 코드 첫 번째 방법을 사용하여 엔티티를 매핑하려고했습니다. 모든 nullable numeric 열은 프리미티브 Int32 (nullable이 아님)로 선언 된 속성에 매핑된다는 사실을 발견 한 이후로 모든 것이 작동하는 것처럼 보였습니다.

CREATE TABLE [dbo].[SomeTable](
    [Id] [int] NOT NULL, 
    [Descrip] [nvarchar](50) NULL, 
    [SomeNumericCol] [int] NULL, 
CONSTRAINT [PK_SomeTable] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)) ON [PRIMARY] 

와 해당 POCO :

public class SomeTable 
{ 
    public Int32 Id { get; set; } 
    public string Descrip { get; set; } 
    public Int32 SomeNullableCol { get; set; } 
} 

당신이 열 SomeNullableCol와 대응 사이에 차이가 나타날 수 있습니다 예를 들어

,이 전 테이블이 있다고 가정 해 보자 특성의 마지막 유형은 null을 허용하지 않는 원시 int이므로

SomeNullableCol의 형식을 nullable int (Int32?)로 변경하지 않고이 매핑을 작동시킬 수있는 해킹이 있습니까? 가능한 경우 클래스의 코드를 건드리지 마십시오.

감사합니다.

답변

1

POCO의 속성을 null로 설정할 수 있습니까?

public class SomeTable 
{ 
    public Int32 Id { get; set; } 
    public string Descrip { get; set; } 
    public Int32? SomeNumericCol { get; set; } 
} 
+0

아니요, 저는 말할 수 없습니다. int가 될 속성에 의존하는 코드가 너무 많아서 nullable 유형으로 변경할 수 없습니다. 많은 * 속성의 변경도 ... – Maxolidean

1

예, 데이터 주석으로 마스크하십시오. nullable int를 만들고 열 이름에 마스크를 적용한 다음 nullable 열의 int 값만 반환하는 같은 이름의 매핑되지 않은 속성을 만듭니다.

 [Column("SomeNullableCol")] 
     public int? TestValue { get; set; } 

     [NotMapped] 
     public int SomeNullableCol 
     { 
      set { TestValue = value; } 
      get 
      { 
       if (TestValue != null) return (int) TestValue; 
       return -1; 
      } 
     } 
+0

그건 내가 POCO 정의를 만지고 싶지 않기 때문에 문제의 일부를 해결할 것이다. 그럼에도 불구하고, 그것은 다음 생각을 준다 : POCO를 상속하고 "proxy"속성을 추가한다. 거기에 반사에 의해 그것을 시도 할 것입니다 ... – Maxolidean

+2

이 해킹 적어도 POCO의 현재 구조를 유지하기 때문에 레거시 코드가 귀하의 요구 사항에 그것을 강화하는 동안 중단됩니다. 또 다른 옵션은 중간 남자를 사용하는 것입니다. POCO를 레거시 DB와 일치시킨 다음 이전 POCO를 새로운 DB로 매핑합니다. – benjamin

+0

예. 말했듯이 nswer는 nullable 속성을 가진 유형을 동적으로 작성하는 아이디어를 내게 부여합니다 (Reflection.Emit 사용). 그런 다음 생성 된 유형을 데이터베이스에 매핑 할 수 있습니다. 감사. – Maxolidean

관련 문제