2012-08-02 7 views
12

Il Proc memorizzato restituisce una colonna con il valore da 0 o 1 senza conversione in BIT. Nel mio POCO, se dichiaro il campo comeQual è il modo più semplice per gestire la conversione da 0/1 a False/True in EF 4.x?

public bool MyColumn {get; set;} 

sto ottenendo questo errore:

The specified cast from a materialized 'System.Int32' type to the 'System.Boolean' type is not valid. 

Questo rende effettivamente senso dal momento che EF riconosce il valore restituito come un intero.

Mi chiedo se esiste un modo semplice per aggiungere annotazioni o usare fluente API, convertire automaticamente da 0/1 a False/True nella mappatura dietro la scena senza toccare Proc?

Grazie in anticipo!

+4

L'hai già toccato. Converti il ​​valore di ritorno in un bit. –

+0

Boo è corretto. Se non si ha accesso alla stored procedure per modificare il tipo di ritorno della colonna in bit, sarà necessario modificare il tipo di proprietà in un 'int', quindi verificare l'uguaglianza su 0. – rossipedia

+0

Ho avuto un problema simile a questo: all'inizio del processo memorizzato avevo definito una tabella temporanea con una colonna di tipo Bit. Quando restituivo i risultati, stavo unendo una selezione dalla tabella temporanea, con un'altra query in cui il valore per la colonna dei bit era appena impostato su "0". Stavo ottenendo lo stesso errore di cui sopra, e ho finito per risolverlo usando cast (bitcolumn as bit) - questo poi ha risolto l'errore, e non ho avuto bisogno di cambiare il codice per aggirare questo problema. – hitch

risposta

12

Quello che puoi fare è avere un'altra proprietà per rappresentare la rappresentazione booleana. Decorarlo con l'attributo NotMapped in modo che EF non lo consideri per la mappatura. Fare e se condizione e restituire true /false in base al valore di Altre proprietà.

public Class Customer 
{ 

    [NotMapped] 
    public bool MyColumnBool 
    { 
     get 
     { 
     return (MyColumn ==1); 
     } 
    } 

    public int MyColumn {get; set;} 
    // other properties 

} 
+4

+1, anche se restituire 'MyColumn! = 0' solo nel caso in cui la verità sia realmente diversa da zero. – Tergiver

-3

Usa System.Convert.ToBoolean(int)

+0

È facile. Basta fork e aggiornare il codice sorgente EF per farlo, e quando la tua richiesta di pull è accettata, EF farà automaticamente 'System.Convert.ToBoolean (int)' mentre materializza i risultati della query. – ProfK

23

Un'altra opzione è quella di restituire un po 'dalla stored procedure in modo che non c'è bisogno di lanciare qualsiasi cosa in C# lato o utilizzare alcun decorazione strano. Ciò significa che puoi trasmettere il valore intero a BIT in T-SQL come faccio qui sotto:

select col1, col2, CONVERT(BIT, CASE WHEN col3 IS NULL THEN 0 ELSE 1 END) as colWithBit 
FROM table1 
+4

Questa dovrebbe essere la risposta accettata ... – caesay

Problemi correlati