2009-04-16 3 views
1

Entity Framework에서 adhoc 쿼리를 통해 다음 시퀀스 번호를 검색하려고합니다. 내가 사용하고 있습니다 :Entity Framework를 사용하여 DB2에서 다음 순차 번호를 얻는 방법은 무엇입니까?

LogEntities db = new LogEntities(); 

ObjectQuery<Int64> seq = db.CreateQuery<Int64>("SELECT AUDITLOG.EVENTID_SEQ.NEXTVAL from sysibm.sysdummy1"); 

이 다음과 같은 오류를 반환합니다.

ERRORDESCRIPTION = " 'SYSIBM.SYSDUMMY1'현재 범위 또는 맥락에서 해결 될 수없는 모든 참조 변수가 있는지 확인 범위에서 필요한 스키마가로드되고 해당 네임 스페이스가 올바르게 참조됩니다. "

sysdummy1이 (가) 내 모델의 매핑 된 테이블이 아니기 때문입니다.

누구든지 LINQ 2 엔터티 컨텍스트를 사용하여이 쿼리를 수행 할 수있는 방법을 알고 있습니까?

답변

1

답장을 보내 주셔서 감사합니다. Craig. 자동 증가 ID 열을 사용할 수없는 이유는이 특정 논리 테이블이 물리적으로 31 개의 개별 테이블 (일별)로 분할되어 있고 ID가 모든 테이블에서 고유해야하기 때문입니다.

시퀀스에서 다음 번호를 검색하고이를 내 EF 모델 저장소에 추가하는 저장 프로 시저를 만들었습니다.

private static long GetNextEventId(DbConnection dbConnection) 
{ 
    using (DbCommand cmd = dbConnection.CreateCommand()) 
    { 
     cmd.CommandText = "LogEntities.GetNextEventId"; 
     cmd.CommandType = CommandType.StoredProcedure; 

     // Execute the command 
     return Convert.ToInt64(cmd.ExecuteScalar()); 
    } 
} 

여기 EF에서 저장 프로 시저를 호출하여 스칼라를 반환하는 또 다른 방법이 있습니다.

Using Stored Procedures That Return Non Entity Type

1

ObjectQuery는 "일반"SQL이 아닌 Entity SQL을 사용해야합니다. "일반"SQL을 작성하려면 ObjectQuery가 아닌 상점 연결을 사용해야합니다. 즉, 일련 번호를 수동으로 검색하는 이유가 궁금합니다. 엔터티 속성이 서버에서 자동 증가로 설정되어 있으면 SaveChanges를 실행하면이 속성이 자동으로 검색됩니다. 저장소 연결을 가져와야하는 경우 엔 EntityConnection 유형 인 CreateDbCommand에 대한 메소드가 있습니다. 다시 말하지만, 그렇게하지 않는 것이 좋습니다. 이 기능을 사용하면 코드 공급자에 따라 다릅니다. 대부분의 Entity Framework 코드는 공급자를 불가지론해야합니다.

0

또 다른 옵션은 ID 열이있는 테이블을 생성하고 삽입 후 신원 발 기능의 값을 사용하는 것입니다.

관련 문제