Recentemente ho avuto la causa di riportare solo un singolo valore oltre ai dati tabulari restituiti dalla stored procedure. Dal momento che EF non supporta le stored procedure con più set di risultati, ho pensato che avrei potuto farlo tramite un parametro di output. Tuttavia, utilizzando questo metodo ho riscontrato un problema in cui in I stavo ottenendo solo valori arrotondati per alcuni campi del valore numerico.Come utilizzare correttamente InOut ObjectParameter in EF4?
Il parametro alla mia stored procedure è stata dichiarata come:
@MyValue numeric(19,6) output
Quando si chiama la funzione di mappatura, ho avuto:
var myValue = new ObjectParameter("MyValue", typeof(decimal));
List<MyResultItem> results = this.ObjectContext.CallMyStoredProc(someId, myValue).ToList();
Questo è ciò che sempre restituito il valore arrotondato al numero intero (vale a dire , scala zero).
primo luogo sono stato in grado di risolvere questo problema modificando manualmente il codice XML sottostante al edmx aggiungendo manualmente precisione e la scala attributi:
<Parameter Name="MyValue" Type="numeric" Mode="InOut" Precision="19" Scale="6" />
Questo è stato, non a caso, del tutto scartata la prossima volta ho eseguito " aggiorna modello dal database .."
mi sembra di aver risolto in modo più affidabile aggiornando la mia dichiarazione per la ObjectParameter
in quanto tale:
var myValue = new ObjectParameter("MyValue", 999999999.999999M);
Tuttavia, questo sembra un po 'terribile come un hack, e sono preoccupato per problemi in futuro (anche se si tratta solo di manutenzione per quanto riguarda questo numero magico). Esiste un modo migliore e affidabile per utilizzare i parametri di output all'interno di Entity Framework?
I decimali in. NET mantengono le cifre così hai provato a utilizzare 0.0M o 0.000000M invece di vedere se funziona? Sarebbe almeno un po 'meno "magico", suppongo che stia tornando allo 0M predefinito (senza cifre) – XIU
@XIU Non ho idea del motivo per cui lo fa, ma se passo 0..M con un numero qualsiasi di trascinamento zeri, quindi il 'myValue.Value' risultante è sempre 0. Inoltre, gli ObjectParameters successivi che invio alla query sono DBNull invece di essere impostati. Assolutamente bizzarro. –
Possibile duplicato di http://stackoverflow.com/questions/18166992/decimal-output-parameter-rounded-to-inte-in-ef5-0 –