2017-06-08 2 views
6

J'ai cette classeComment utiliser la procédure de base de données dans la cartographie de Fluent NHibernate

public class Bill : EntityBase 
{ 
     public virtual decimal Value { get; set; } 
} 

et ci-dessous la cartographie, je remplis la valeur de la « valeur » à l'aide d'une procédure dans un Formula()

public class MapBill : ClassMap<Bill> 
{ 
    public MapBill() 
    { 
     Table("cabrec"); 
     Map(m => m.Value) 
      .Formula(
"(select t.VALOR_IND from ret_vlorind(1,1,cast('02/06/1993' as Date)) as t)") 
      .CustomType(typeof(decimal)); 
    } 
} 

Mais il renvoie l'erreur lors de l'exécution:

{"Dynamic SQL Error\r\nSQL error code = -104\r\nToken unknown - line 1, column 279\r\n."} 

Existe-t-il un moyen d'utiliser la procédure dans un nhibe fluide? rnate?

+0

Quel type de Db vous utilisez. Peut-être que cela pourrait résoudre votre problème http://www.iprogrammable.com/2009/09/05/get-oracle-stored-procedure-output-object-output-in-nhibernate/ – tykovec

+0

Merci pour la réponse, j'avais déjà essayé manière mais en vain. Le problème est dans l'alias de la procédure. en utilisant Firebird. –

Répondre

5

L'expression de la cartographie de formule est converti par la suite NHibernate à déclaration comme celle-

// source in code 
(select t.VALOR_IND from ret_vlorind(1,1,cast('02/06/1993' as Date)) as t) 
// sent SQL statement 
(select t.VALOR_IND from ret_vlorind(1,1,cast('02/06/1993' as Date)) as this_.t) 

Le this_. Le préfixe est injecté aux endroits où NHibernate pense qu'il devrait utiliser correctement l'alias de la table MAIN.

Ce n'est pas ce que nous voulons .. et la seule façon que j'ai trouvé, est d'introduire notre propre dialecte (je travaille avec SQL Server) et de définir certains "CONSTANTS" à traiter comme - Je n'ai pas besoin de préfixe

public class CustomMsSql2012Dialect : MsSql2012Dialect 
{ 
    public CustomMsSql2012Dialect() 
    { 
     RegisterKeyword("my_table_alias"); 
     ... 

Cela doit être utilisé pour la configuration

<property name="dialect">MyNamespace.CustomMsSql2012Dialect,MyLib</property> 

Et enfin, nous devons ajuster notre déclaration

// wrong t is not known keyword.. would be prefixed 
(select t.VALOR_IND from ret_vlorind(1,1,cast('02/06/1993' as Date)) as t) 
// into this 
(select my_table_alias.VALOR_IND from ret_vlorind(1,1,cast('02/06/1993' as Date)) as my_table_alias) 

REMARQUE: mots-clés, mon expérience, doit être juste Minuscule

+0

Merci pour la réponse. J'utilise Fluent Nhibernate. Je dois comprendre le problème, mais je suis nouveau à 'Fluent' et je ne sais pas où je peux créer cet alias, savez-vous si vous pouvez créer cela en utilisant 'Fluent'? –

+1

Eh bien, le seul changement (à l'aise) serait la façon dont le dialecte est défini. Cochez cette case http://nhibernate.info/blog/2008/09/06/a-fluent-interface-to-nhibernate-part-4-configuration.html. 'Un exemple var cfg = new MyConfiguration() .ShowSql() .Driver () .Dialect ()' –

+1

ne devrait pas le 't.VALOR_IND' être modifié: my_table_alias.VALOR_IND '? Dans le cas de l'OP, son dialecte de base serait 'FirebirdDialect'. Oui, les mots-clés doivent être enregistrés en minuscules. Un peu malheureux, il n'est pas ajusté par 'RegisterKeyword' lui-même, mais c'est le cas actuellement. Ils vont correspondre à n'importe quel cas dans les requêtes, à condition qu'ils aient été enregistrés en minuscules. (Les jetons candidats sont "en minuscules" avant de correspondre.) –