2011-03-31 3 views
3

나는 asp.net mvc 3 모형에서 EFCode를 첫째로 사용한다. (엔티티 프레임 워크 4.0 및 EFCode 먼저 0.8) 이 모델은 아래와 같이 정의된다 :EFCode 첫번째 속성 널 문제

The 'WorkedYears' property on 'User' could not be set to a 'null' value. You must set this property to a non-null value of type 'Int32'.

참고 : user.Id = 1이 데이터베이스에 존재

public class User 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int WorkedYears { get; set; } 
} 

때 사용 db.Users.Find(1),이 오류가 발생합니다 , 레코드의 WorkedYears가 NULL입니다. 데이터베이스에 WorkedYears = 0을 설정하면 오류가 사라지고 다음과 같은 속성을 정의한 경우 public int? WorkedYears{get; set;} 오류도 처리됩니다. 하지만 int를 사용하고 싶지 않습니다. 또한 설정되지 않은 경우 NULL을 유지하고 싶습니다. 해결할 다른 해결책이 있습니까?

고마워요.

+1

EFCode First 0.8이란 무엇입니까? EF Code-First의 최신 버전은 다음에서 찾을 수 있습니다. http://blogs.msdn.com/b/adonet/archive/2011/03/15/ef-4-1-release-candidate-available.aspx EF라고 불립니다. 4.1 출시 후보. 업그레이드하는 것이 좋습니다. – Slauma

답변

18

귀하의 모델에 귀하의 데이터베이스가 반영되지 않았기 때문에 모델이 작동하지 않습니다. WorkedYearsint?으로 정의해야합니다. 보기에이 속성이 필수 항목 인 경우 WorkedYears가 null 인 새 클래스 "보기 모델"을 정의하고 데이터베이스에 null이 포함되어 있으면 해당 속성에 포함 된 항목을 처리해야합니다. EF에 대한

올바른 POCO :

public class User 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int? WorkedYears { get; set; } 
} 

올바른보기 모델 : ->UserModel

public class UserModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int WorkedYears { get; set; } 
} 

컨트롤러는 User < 변환 할 책임이 있습니다.

public class User 
{ 
    [Key] 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int? WorkedYears { get; set; } 
    [NotMapped] 
    public int WorkedYearsDisplay 
    { 
     get 
     { 
      return WorkedYears ?? 0; 
     } 
     set 
     { 
      WorkedYears = value == 0 ? new Nullable<int>() : value; 
     } 
    } 
} 

결론 : 당신은 여전히 ​​하나의 클래스를 사용하려면 당신은 내부적으로 nullabe WorkedYears을 사용합니다 둘째 매핑되지 속성을 추가해야합니다 데이터베이스가 당신의 매핑에 Null 허용 속성을 가지고 있어야합니다 null 값을 포함 할 수 있습니다 널 (NULL) 필드가 포함 된 경우 수업. 다른 방법은 없습니다.

+0

고마워. 나는 너의 방법을 시도 할 것이다. 하지만 nullable 속성을 제외한 다른 방법이 있는지 계속 검색하려고합니다. – Alexey

+0

Ladislav가 nullable 값 유형에 속성을 바인딩 할 수있는 다른 방법이 없다는 것이 확실합니다. 데이터베이스 필드에 "값이 있거나 설정되지 않은 경우 null이 있습니다."라고 생각하면 nullable 유형이 사용할 수있는 것과 정확히 같습니다. WorkedYears가 쿼리에서 null 인 모든 항목을 명시 적으로 필터링하여 '오류'를 우회 할 수 있습니다. 그렇지 않으면 기본적으로 호출자에게 투명한 '기본'값을 정의하는 매핑되지 않은 속성에 대한 Ladislav의 제안이 필요합니다. – Perry