2009-10-07 2 views
-1

FluentMapping으로 oracle의 기존 db에 연결하려고합니다. 나는 고객oracle의 레거시 데이터베이스에 대한 Fluent Nhibernate

public CustomerMapping() 
    { 

     Not.LazyLoad(); 
     Id(x => x.Cst_Recid).GeneratedBy.Increment() ; 
    } 

이상 매핑을 얻고 난 내가없는 오전 sessionFactory에

public class MyDataProvider 
{ 
    public static Customer GetCustomerById(long customerId) 
    { 
     ISessionFactory sessionFactory = SessionFactory.CreateSessionFactory(); 
     ISession session = sessionFactory.OpenSession(); 
      return session.Linq<Customer>().Where(x => x.Cst_Recid.Equals(temp)).FirstOrDefault(); 

    } 


} 

을 시도하고 만들 수있는 몇 가지 시험 클래스가 세션을

public static ISessionFactory CreateSessionFactory() 
    { 
     return Fluently 
      .Configure() 
      .Database(OracleClientConfiguration.Oracle10.ConnectionString 
      ("....")) 
      .Mappings(m => 
      { 
       m.FluentMappings.AddFromAssemblyOf<CustomerMapping>(); 

      }) 
      .BuildConfiguration() 
      .BuildSessionFactory(); 
    } 

을 만들려고하고 있어요 세션을 열고 정품 인증을 받고 있는데도 ID로 고객을 확보 할 수 있습니다 ...

,210

시험은 매우 간단합니다 - 단지 실수가

[Test] 
    public void CanGetCustomerById() 
    { 
     MyDataProvider provider = new MyDataProvider(); 
     Assert.AreEqual(33941, MyDataProvider.GetCustomerById(33941).Cst_Recid); 

    } 

선택 활동 확인 -

TestCase에 '... DataLayer.Tests.CustomerMappingTests.CanGetCustomerById' 실패를 : NHibernate.ADOException : 쿼리를 실행할 수 없습니다 [* FROM (Cst6_0_0_ 같은 Cst1_0_0_, this_.Cst_Customerid Cst2_0_0_로서 this_.Cst_First_Name Cst3_0_0_로서 this_.Cst_Group_Recid Cst4_0_0_로서 this_.Cst_Insdbdt Cst5_0_0_로서 this_.Cst_Insdbuser, this_ this_.Cst_Recid로 선택한다. Cst_Joingroup_Dt를 Cst7_0_0_, this_.Cst_Last_Name을 Cst8_0_0_, this_.Cst_Lastupddt를 Cst9로 지정하십시오. P0) 여기서 ROWNUM < = : P1 _0_0_, Cst10_0_0_, Cst11_0_0_ 같은 this_.Cst_Tat_Lakoach_Meshalem 같은 this_.Cst_Lastupduser는 this_ WHERE this_.Cst_Recid = "고객"의 Cst14_0_0_ 같은 Cst12_0_0_, Cst13_0_0_ 같은 this_.Cst_Tziyun_Meshalem_Rashi_Only, this_.Cst_Tziyun_Mizdamen로 this_.Cst_Typeid ] 위치 매개 변수 # 0> 33,941 [SQL SELECT *은 (Cst4_0_0_ 같은 Cst1_0_0_, this_.Cst_Customerid Cst2_0_0_로서 this_.Cst_First_Name Cst3_0_0_로서 this_.Cst_Group_Recid, Cst5_0_0_ 같은 this_.Cst_Insdbdt, this_ this_.Cst_Recid로 선택한다. Cst6_0_0_, Cst7_0_0_ 같은 this_.Cst_Joingroup_Dt, Cst8_0_0_ 같은 this_.Cst_Last_Name, Cst9_0_0_ 같은 this_.Cst_Lastupddt, Cst10_0_0_ 같은 this_.Cst_Lastupduser, Cst11_0_0_ 같은 this_.Cst_Tat_Lakoach_Meshalem 같은 Cst_Insdbuser는 Cst13_0_0_뿐만 아니라 this_.Cst_Tziyun_Mizdamen Cst12_0_0_, this_.Cst_Tziyun_Meshalem_Rashi_Only로 this_.Cst_Typeid Cst14_0_0_ FROM "고객"this_ WHERE this_.Cst_Recid = : p0) 여기서 ROWNUM < = P1] ----> System.Data.OracleClient.OracleException : ORA-00942 : 테이블 또는 뷰가

그는 FluentNHibernate에 의해를 automaticly 구축되어 실행하려고하는 쿼리를 존재하지 않습니다. 쿼리를 바로 실행하면 quoates를 제거하면 결과가 나타납니다. 문제는 내가 원하는대로 쿼리를 변경할 수 없다는 것입니다. 어쩌면 문제는 Oracle 11g를 사용하고 있으며 FluentNhibernate가 Oracle 9 또는 10?

은 도움이 될 것입니다.

+0

데이터베이스에 대한 모든 쿼리에 대해 세션 팩토리를 만들 필요가 없습니다. 한 번 작성한 다음 매회마다 세션을 반환하도록하십시오. –

+0

안녕하세요. 대답 해줘서 고마워 . 문제는 seesionFasctory가 아니라 올바르게 구축되지 않은 쿼리입니다. 질문은 왜, 어떻게 조정할 수 있을까요? 고객 엔티티를 가져올 것입니다. 물론 개념 증명을 통해 접근 방식을 변경하게됩니다. –

답변

2

내 이전 대답이 잘못되었습니다. 다시 시도하도록 허락 해주세요!

오라클에서 개체 이름을 인용하면 대/소문자가 구분됩니다. 고객 테이블이 인용되고있는 "고객"과 동일하지 않습니다 "고객"으로 인용되고있다 :

SQL> select * from "dual"; 
select * from "dual" 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> select * from "Dual"; 
select * from "Dual" 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> select * from "DUAL"; 

D 
- 
X 

나는 여전히 유체 NHibernate에 대해 아무것도 몰라,하지만 그것을 찾기 위해 얻을 수 있습니다 "Customers"테이블 대신 "CUSTOMER"테이블을 사용합니까?

또는 아무것도 그 밖에 CUSTOMERS 테이블을 찾고하지 않은 경우, 당신은 ... 그러나, 이것은 고객 테이블에 대한 참조를 깰 것을 "고객"이름을 바꿀 수 있습니다 :

SQL> create table CUSTOMERS (x int); 

Table created. 

SQL> insert into CUSTOMERS (x) values (1); 

1 row created. 

SQL> select * from CUSTOMERS; 

     X 
---------- 
     1 

SQL> select * from "Customers"; 
select * from "Customers" 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> select * from "CUSTOMERS"; 

     X 
---------- 
     1 

SQL> alter table CUSTOMERS rename to "Customers"; 

Table altered. 

SQL> select * from CUSTOMERS; 
select * from CUSTOMERS 
       * 
ERROR at line 1: 
ORA-00942: table or view does not exist 


SQL> select * from "Customers"; 

     X 
---------- 
     1 

행운을 빕니다! 이 도움이되기를 바랍니다.

+0

와우 .. 방금 ​​파일 이름을 리팩토링했습니다. CUSTOMER.cs에 대한 엔티티와 쿼리가 작동했습니다. 덕분에 많이. . 정말 도움이되었습니다. –

+0

이 문제가있는 마지막 핸들은 맵핑 파일을 호출하고 원하는 엔티티 파일을 호출하기 위해 내부 매핑 파일을 추가합니다. 생성자 TABLE ("TheRightTableNameAsAppearsInDb") 을 수정하면됩니다. –

관련 문제