2013-08-31 1 views
0

이 문제와 관련하여 도움이나 조언을 주시면 대단히 감사하겠습니다.Oracle 테이블/뷰가있는 Entity Framework 5가 불일치하지 않습니다?

현재 로컬 MS SQL 인스턴스에서 호스팅 된 Oracle 솔루션으로 데이터 계층을 변경해야하는 프로젝트를 진행 중입니다.

이전에는 Entity Framework (코드 우선)를 사용하여 데이터 계층을 구축했습니다. 새로운 데이터 레이어로 동일한 접근 방식을 사용하고 싶습니다. 우리는이 라이브러리를 사용하는 몇 가지 응용 프로그램을 가지고 있으므로 원본 데이터와 동일한 (객체, 이름 등) 데이터에 가까운 새로운 데이터 영역을 유지하는 것이 이상적입니다. 나는 Code-First가 오라클 (공식적으로 진행중인)에 의해 공식적으로 지원되지는 않지만 다른 사람들이 성공을 거둔 곳을 읽었다는 것을 알고있다. 따라서, 이러한 이유로, 나는 같은 것을 시도하고있다.

필자는 원래의 MS SQL EF 데이터 레이어와 최대한 일치하도록 Oracle EF 데이터 레이어를 만들었습니다. 현재 문제는 데이터 레이어에서 첫 번째 또는 기본 엔터티를 검색하기 위해 쿼리를 실행할 때 다음 예외가 발생한다는 것입니다.

Oracle.DataAccess.Client.OracleException : ORA-00942 : table 또는보기 내가 똑같은 DbContext 인스턴스를 사용하는 경우

존재하고 대신 DbContext.Database.SqlQuery (sqlString)를 사용하여 SQL 쿼리를 실행하지 않습니다, 그것은 작동합니다. 내가 언급 한 이유는 "테이블 또는 뷰가 존재하지 않습니다"라는 오류가 데이터베이스 사용 권한 문제를 참조하기 때문입니다. 그것은 같은 연결 개체에서 똑같은 연결 문자열을 사용하고 있기 때문에 이번 경우에는 나타나지 않습니다. 유일한 차이점은 DbSet 엔티티 (& 구성)와 비교하여 전통적인 SQL 문을 사용하는 것입니다.

내 개체는 상대적으로 단순하고 평평한 개체입니다. 내 DbContext 내부

public class HourlyPrice 
{ 
    public DateTime MarketDate { get; set; } 
    public int HourEnding { get; set; } 
    public string LocationId { get; set; } 
    public string LocationName { get; set; } 
    public decimal? Price { get; set; } 
    public int IsValid { get; set; } 
    public DateTime DateInserted { get; set; } 
    public DateTime? DateUpdated { get; set; } 
} 

public HourlyPriceConfiguration(string viewName) 
{ 
    ToTable(viewName); 
    HasKey(x => new { x.MarketDate, x.HourEnding, x.LocationName }); 
    Property(x => x.Price).HasPrecision(13, 6); 
    HasEntitySetName("SourceHourlyPrices"); 
} 

, 나는

public IDbSet<HourlyPrice> SourceHourlyPrices { get; set; } 

코드를 실행하는 경우 ...

modelBuilder.Configurations.Add(new HourlyPriceConfiguration(this.viewName)); 
... viewName과 주입 HourlyPriceConfiguration을 추가 ...하고 내 IDbSet 선언 이 작품은 ...

var sql = "select * from " + this.viewName; 
var prices = db.Database.SqlQuery<HourlyPrice>(sql); 
var price = prices.FirstOrDefault(); 

...하지만이 ...

var price = db.SourceHourlyPrices.FirstOrDefault(); 

... "테이블 또는 뷰가 없습니다"라는 오류가 발생합니다.

코드 첫 번째 접근 방식에 문제가 있습니까? 아니면 여기에 뭔가 빠졌습니까? 응용 프로그램을 디버깅 할 때 구성 클래스에 전달되는 viewName이 SqlQuery에서 사용되는 SQL 문으로 전달되는 것과 동일하다는 것을 알 수 있습니다. HasEntitySetName()을 제거하고 표준 HourlyPrices에 대한 IDbSet을 변경하려고 시도했지만 작동하지 않습니다.

다시 한번 감사드립니다.

답변

2

ORA-00942 예외는 권한 문제가 아닙니다 (물론 어떻게 보느냐에 따라 다릅니다). 그러나 쿼리하는 테이블이 사용자에게 표시되지 않는다는 것을 의미합니다.

ToTable(tableName, schemaName) 구현을 사용하여 ToTable 메서드 호출에서 스키마 이름을 명시 적으로 설정하고 어떤 결과가 발생하는지 확인할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. mmg666. 나는 그것을 일찍 시도해 봤고 (확실하게 언급 했어야했다), 다시 시도했다. 나는 여전히 같은 오류가 발생합니다. –

+0

문제를 발견 한 것으로 보입니다. 구성 클래스에 전달되는 viewName 인수에 대해 ToUpper()를 수행해야했습니다. 오라클과의 첫 경험이지만 오라클의 모든 데이터베이스 객체는 모두 상한입니다. 이것이 오라클이거나 오라클 서버가 설치되어있는 것인지 확실하지 않습니다. 어떤 경우이던간에 ToUpper()는 매핑을 올바른보기로 수정했습니다. 이제 내 엔티티의 IsValid 속성에 다른 매핑 문제가 있습니다. 한때 MS SQL에서 bool이었던 것은 이제 Oracle에서 NUMBER (1,0)입니다. 이를 해결하기 위해 노력해야하지만 다른 주제입니다. 고마워, mmg666. –

+0

~ 6 시간 안에이 질문에 답할 것입니다. (평판이 아직 부족합니다.) –

4

테이블 이름에 동일한 문제가 있음을 확인하고 싶습니다. 이름이 꽉 찼 으면 Oracle에서 UPPER CASE 테이블/뷰를 찾을 수 없습니다.

0

DB를 다른 스키마로 이동 한 후 동일한 문제가 있음을 추가하고 싶습니다. ToTable(tableName, schemaName)을 사용할 때 대문자로 스키마 이름을 사용하는 것이 중요하다는 것을 알게되었습니다.

2

코드 첫 번째 자동 마이그레이션은 dbo 스키마로만 작업 할 수 있습니다. https://community.oracle.com/thread/3622163

당신은 해결로 컨텍스트 클래스의 방법을 OnModelCreating 시작에 넣을 수 있습니다.

if (this.Database.Connection.GetType().Equals(typeof(Oracle.ManagedDataAccess.Client.OracleConnection))) 
{ 
    modelBuilder.HasDefaultSchema(new Oracle.ManagedDataAccess.Client.OracleConnectionStringBuilder(this.Database.Connection.ConnectionString).UserID); 
} 
관련 문제