2009-10-07 8 views
-1

J'essaie de me connecter à la base de données existante dans Oracle avec fluentmapping. Je suis cartographie sur clientsFluent Nhibernate sur la base de données existante dans Oracle

public CustomerMapping() 
    { 

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

et je suis en train de créer la session

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

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

j'ai une classe d'essai pour essayer de créer le 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(); 

    } 


} 

Je ne suis pas capable d'obtenir le client par l'identification même si je commence à ouvrir la session et l'activation ...

le test est très simple - que pour vérifier l'activité de sélection

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

    } 

il y a une erreur -

TestCase '... DataLayer.Tests.CustomerMappingTests.CanGetCustomerById' a échoué: NHibernate.ADOException : Impossible d'exécuter la requête [select * from (SELECT this_.Cst_Recid comme Cst1_0_0_, this_.Cst_Customerid comme Cst2_0_0_, this_.Cst_First_Name comme Cst3_0_0_, this_.Cst_Group_Recid comme Cst4_0_0_, this_.Cst_Insdbdt comme Cst5_0_0_, this_.Cst_Insdbuser comme Cst6_0_0_, this_. Cst_Joingroup_Dt en tant que Cst7_0_0_, this_.Cst_Last_Name en tant que Cst8_0_0_, this_.Cst_Lastupddt en tant que Cst9 _0_0_, this_.Cst_Lastupduser comme Cst10_0_0_, this_.Cst_Tat_Lakoach_Meshalem comme Cst11_0_0_, this_.Cst_Typeid comme Cst12_0_0_, this_.Cst_Tziyun_Meshalem_Rashi_Only comme Cst13_0_0_, this_.Cst_Tziyun_Mizdamen comme Cst14_0_0_ DE "Client" this_ OÙ this_.Cst_Recid =: p0) où rownum < =: p1 ] paramètres positionnels: # 0> 33941 [SQL: select * from (sELECT this_.Cst_Recid comme Cst1_0_0_, this_.Cst_Customerid comme Cst2_0_0_, this_.Cst_First_Name comme Cst3_0_0_, this_.Cst_Group_Recid comme Cst4_0_0_, this_.Cst_Insdbdt comme Cst5_0_0_, this_. Cst_Insdbuser comme Cst6_0_0_, this_.Cst_Joingroup_Dt comme Cst7_0_0_, this_.Cst_Last_Name comme Cst8_0_0_, this_.Cst_Lastupddt comme Cst9_0_0_, this_.Cst_Lastupduser comme Cst10_0_0_, this_.Cst_Tat_Lakoach_Meshalem comme Cst11_0_0_, this_.Cst_Typeid comme Cst12_0_0_, this_.Cst_Tziyun_Meshalem_Rashi_Only comme Cst13_0_0_, comme this_.Cst_Tziyun_Mizdamen Cst14_0_0_ FROM "Client" this_ OERE this_.Cst_Recid =: p0) Où rownum < =: p1] ----> System.Data.OracleClient.OracleException: ORA-00942: table ou vue n'existe pas

la requête qu'il tente d'exécuter est construit par FluentNHibernate automatiquement. Si je supprime le quoates la requête s'exécute correctement, il obtient le résultat .. le problème est que je ne peux pas changer la requête comme je veux .. peut-être le problème est que nous utilisons Oracle 11 g et FluentNhibernate ajusté seulement à Oracle 9 ou dix ?

appreceate toute aide.

+0

Vous n'avez pas besoin de créer une fabrique de sessions pour chaque requête à la base de données. Créez-le une fois, puis laissez-le vous renvoyer des sessions à chaque fois. –

+0

Salut à tous. Merci de répondre . Le problème n'est pas celui de seesionFasctory, mais la requête en cours de construction n'est pas correcte. la question est pourquoi et comment puis-je l'ajuster afin qu'il "obtienne moi l'entité client .. bien sûr, après l'épreuve de concept je vais changer l'approche .. –

Répondre

2

Ma réponse précédente était incorrecte. Permettez-moi d'essayer à nouveau! Lorsque vous citez un nom d'objet dans Oracle, il devient sensible à la casse. Votre table CLIENT est cité comme « Client » qui n'est pas la même chose que d'être cité « CLIENT »:

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 

Je ne sais pas encore quoi que ce soit au sujet du fluide NHibernate, mais est-il possible d'obtenir à chercher une table "CLIENT" au lieu d'une table "Clients"?

Sinon, si rien d'autre est à la recherche d'une table de clients, vous pouvez le renommer en « clients » ... Cependant, ce qui va ramollir les références à une table CLIENTS:

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 

Bonne chance! J'espère que cela aide ...

+0

wow .. je viens de refactoriser le nom de fichier de l'entité à CUSTOMER.cs et la requête a travaillé. merci beaucoup. ça m'a vraiment aidé. –

+0

le dernier handle avec ce problème est, pour appeler votre fichier de mappage et le fichier d'entité que vous voulez, ajoutez simplement le fichier de mappage à l'intérieur du constructeur TABLE ("TheRightTableNameAsAppearsInDb") qui va le réparer. –

Questions connexes