2012-05-25 5 views
3

를 사용하여 데이터 주석지도 내 열이 나는이처럼 보이는 클래스가되지 않습니다)에서 DbContext :왜 엔티티 프레임 워크

public List<T> ExecProc<T>(string proc, Dictionary<string, object> params) 
{ 
     var parms = new List<SqlParameter>(); 
     var sql = new StringBuilder(); 
     sql.Append(sproc.StoredProcedure); 
     sql.Append(" "); // a space, that's all it is 
     foreach (var key in sproc.Parameters.Keys) 
     { 
      sql.Append(string.Format("{0},", key)); 
      parms.Add(new SqlParameter(key, sproc.Parameters[key])); 
     } 
     if (sql[sql.Length - 1] == ',') // removing the trailing , 
     { 
      sql.Remove(sql.Length - 1, 1); 
     } 
     return Database.SqlQuery<T>(sql.ToString(), parms.ToArray()).ToList(); 
} 

반환 된 목록은이 경우의 행 (또는 객체의 정확한 양)을 포함하지만, 등록 중에 값으로 생성되지 않는다. proc이 200 개의 행을 반환하면 목록에 200 개의 객체가 있지만 그 중 아무 것도 값이 채워지지 않습니다.

[Column ("name")] 속성의 필드 이름과 값 사이에 불일치가 없음을 확인했습니다. 결과 집합의 필드 이름과 일치하도록 속성 이름을 변경하면 제대로 작동하지만 데이터 주석을 사용하여 매핑하려고하면 작동하지 않을 수 있습니다. 아무도 내가 여기서 빠뜨린 것을 지적 해 주실 수 있습니까? 나는 그것이 단순한 것이라고 확신한다.

사용 방법 : Visual Studio 2010 Ultimate SP1, .Net 4 SP1, EF 4.2.0 (EF 4.3과 동일한 문제가 발생했습니다). 이 작업은 모두 코드를 사용하여 수행되며 매핑 파일은이 용도로 사용되지 않습니다.

답변

8

보이는 것처럼, 이것은 문서화 된 동작입니다. Database.SqlQuery Method은 DbContext 모델 구성에 직접 연결되어 있지 않습니다.

주어진 일반 유형의 요소를 반환하는 원시 SQL 쿼리를 만듭니다. 형식은 쿼리에서 반환 된 열의 이름과 일치하는 속성을 가진 모든 형식이거나 단순한 기본 형식 일 수 있습니다.

따라서이 방법을 사용할 때 결과 집합 열 이름이 사용 된 유형의 속성 이름과 일치하도록 sql을 구성해야합니다.

+1

3 년 후이 대답이 나를 도왔습니다. 변경할 수없는 데이터 모델이 있지만 이름 지정 규칙과 일치하지 않는 열 이름이 있습니다. 쿼리를 deserialize하는 데 사용하는 POCO에서 데이터베이스의 각 열에 대해 전용 필드를 만들고 올바르게 명명 된 속성을 사용하는 공용 필드를 만들어 비공개 필드의 값을 반환하는 getter 메서드 만 노출합니다. 이것은 다른 3 년 후에 누군가를 도울 수 있습니다. – Ben

+0

다른 14 개월 후 그것은 나를 도왔습니다 :) –