2009-10-07 3 views
-1

Я пытаюсь подключиться к существующим db в oracle с fluentmapping. я получил Mapping над ПользовательскоеFluent Nhibernate над старой базой данных в oracle

public CustomerMapping() 
    { 

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

и я пытаюсь создать сеанс

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

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

я есть пробный класс, чтобы попытаться создать 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(); 

    } 


} 

я не будучи способный получить Клиента по идентификатору, хотя я собираюсь открыть сеанс и активировать ...

тест очень прост - только для проверки выбора активности

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

    } 

есть ошибка -

TestCase '... DataLayer.Tests.CustomerMappingTests.CanGetCustomerById' не удалось: NHibernate.ADOException : не удалось выполнить запрос [выбрать * из (SELECT this_.Cst_Recid в 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 как Cst6_0_0_, this_. Cst_Joingroup_Dt как Cst7_0_0_, this_.Cst_Last_Name как Cst8_0_0_, this_.Cst_Lastupddt как Cst9 _0_0_, this_.Cst_Lastupduser, как Cst10_0_0_, this_.Cst_Tat_Lakoach_Meshalem как Cst11_0_0_, this_.Cst_Typeid, как Cst12_0_0_, this_.Cst_Tziyun_Meshalem_Rashi_Only как Cst13_0_0_, this_.Cst_Tziyun_Mizdamen как Cst14_0_0_ ОТ "Клиент" this_ ГДЕ this_.Cst_Recid =: р0) где ROWNUM < = p1: ] Позиционные параметры: # 0> 33941 [SQL: SELECT * FROM (SELECT this_.Cst_Recid в 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, как Cst6_0_0_, this_.Cst_Joingroup_Dt как Cst7_0_0_, this_.Cst_Last_Name как Cst8_0_0_, this_.Cst_Lastupddt как Cst9_0_0_, this_.Cst_Lastupduser как Cst10_0_0_, this_.Cst_Tat_Lakoach_Meshalem как Cst11_0_0_, this_.Cst_Typeid, как Cst12_0_0_, this_.Cst_Tziyun_Meshalem_Rashi_Only как Cst13_0_0_, как this_.Cst_Tziyun_Mizdamen Cst14_0_0_ FROM «Клиент» this_ WHERE this_.Cst_Recid =: p0), Где ROWNUM < =: p1] ----> System.Data.OracleClient.OracleException: ORA-00942: таблица или представление не существует

запрос, который он пытается запустить, построить автоматически с помощью FluentNHibernate. Если я удаляю квоты, запрос выполняется правильно, он получает результат. Проблема в том, что я не могу изменить запрос, поскольку я хочу. Возможно, проблема в том, что мы используем Oracle 11 g, а FluentNhibernate настроен только на Oracle 9 или 10?

будет предлагать любую помощь.

+0

Вам не нужно создавать фабрику сеансов для каждого запроса к базе данных. Создайте его один раз, затем позвольте ему каждый раз возвращать сеансы. –

+0

Привет. Спасибо за ответ . Проблема заключается не в viewionFasctory, а в вопросе, который строится не в правильном направлении. вопрос в том, почему и как я могу настроить его, чтобы он «получил меня от лица заказчика». , конечно, после доказательства концепции я «изменю подход». –

ответ

2

Мой предыдущий ответ был неверным. Позвольте мне попробовать еще раз!

Когда вы указываете имя объекта в Oracle, оно становится случайным. Ваша таблица КЛИЕНТОВ цитируют как «Клиент», который не является таким же, как цитируют «ЗАКАЗЧИК»:

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 

Я до сих пор ничего о Fluid NHibernate не знаю, но это возможно, чтобы получить его искать таблицу «ЗАКАЗЧИК» вместо таблицы «Клиенты»?

В качестве альтернативы, если ничего другого не ищет таблицу ПОКУПАТЕЛИ, вы можете переименовать его в «Клиенты» ... однако, это нарушит ссылки на таблицы КЛИЕНТЫ:

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

wow .. Я просто реорганизовал имя файла объект к CUSTOMER.cs и запрос работал. спасибо большое. это действительно помогло. –

+0

Последним дескриптором этой проблемы является вызов вашего файла сопоставления и файла сущности, как вы хотите, просто добавьте внутренний файл сопоставления внутри конструктора TABLE («TheRightTableNameAsAppearsInDb») , который исправит его. –