Il tuo esempio di codice non è chiaramente un esempio di lavoro:
- Io non vedo come è possibile convertire un oggetto di tipo
Dealer
a un int
.
- Se si prevede che il metodo restituisca un
long
, perché convertire il risultato della stored procedure in un int
?
- Si passa un parametro
@DealerID
, ma non fa parte della chiamata SP.
- Non sicuro perché uno dei
SqlParameter
s ha una chiamata a .Value
aggiungere su di esso.
Quindi, mi permetta di regolarla, e supponiamo che il punto di partenza è invece qualcosa di simile:
public long AddDealer(Dealer dealer)
{
return AWJE.Database.SqlQuery<Dealer>(
"usp_InsertDealer @Name, @Description",
new SqlParameter("@Name", dealer.Name),
new SqlParameter("@Description", dealer.Description)
).DealerID;
}
O forse si decide che la SP restituisce un long
direttamente, in questo modo:
public long AddDealer(Dealer dealer)
{
return AWJE.Database.SqlQuery<long>(
"usp_InsertDealer @Name, @Description",
new SqlParameter("@Name", dealer.Name),
new SqlParameter("@Description", dealer.Description)
);
}
In entrambi i casi, l'unica semplificazione che vedo è che è possibile modificare l'invocazione su SqlQuery
in modo da utilizzare i parametri posizionali anziché i parametri denominati. Effettuare tale modifica consente di rinunciare alla creazione di istanze esplicite SqlParameter
. La chiamata potrebbe quindi essere semplificata a questo:
public long AddDealer(Dealer dealer)
{
return AWJE.Database.SqlQuery<long>(
"usp_InsertDealer @Name, @Description",
dealer.Name,
dealer.Description
);
}
... dove come si nome @Name
o @Description
non ha più alcuna importanza, ma è necessario assicurarsi che si passa i valori dei parametri nel giusto ordine.
A parte questo, non so se è possibile renderlo più pulito o più elegante.
stai usando il codice prima o hai generato un edmx? so che in passato ho aggiunto una procedura memorizzata al mio edmx e quindi ho potuto chiamarla come una funzione. https://msdn.microsoft.com/en-us/library/vstudio/bb896231(v=vs.100).aspx – kmacdonald
@kmacdonald, ho scritto le stored procedure e le tabelle in SSMS e poi generato dal database. – Chris
Non so cosa sia esattamente 'usp_InsertAddress' ma mi sembra che tu possa semplicemente usare un'entità e aggiungerla al contesto e' SaveChanges() 'o, se hai bisogno di usare proc memorizzati per le operazioni CUD, mappare i proc memorizzati di conseguenza. Inoltre EF proverà a materializzare il risultato della stored procedure in 'IEnumerable
' quindi non sono abbastanza sicuro di come 'Convert.ToInt32()' dovrebbe funzionare qui. – Pawel