Свободное владение Nhibernate над устаревшей базой данных в Oracle - PullRequest
0 голосов
/ 07 октября 2009

Я пытаюсь подключиться к существующей базе данных в oracle с помощью fluentmapping. я получил Картографирование CUstomer

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();

    }


}

Я не могу получить Клиента по Id, хотя я открываю сессию и активирую ...

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

    [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_ FROM "Клиент" this_ WHERE this_.Cst_Recid =: p0) где 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_ ГДЕ this_.Cst_Recid =: p0) где rownum <=: p1] ----> System.Data.OracleClient.OracleException: ORA-00942: таблица или представление не существует

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

оценит любую помощь.

1 Ответ

2 голосов
/ 08 октября 2009

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

Когда вы цитируете имя объекта в Oracle, оно становится чувствительным к регистру. Ваша таблица CUSTOMER цитируется как «Клиент», что не совпадает с цитированием «ЗАКАЗЧИК»:

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, но можно ли заставить его искать таблицу "CUSTOMER" вместо таблицы "Customers"?

В качестве альтернативы, если ничто другое не ищет таблицу CUSTOMERS, вы можете переименовать ее в «Клиенты» ... однако, это приведет к разрыву ссылок на таблицу 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

Удачи! Надеюсь, это поможет ...

...