Sto cercando di utilizzare stored procedure con il nuovo Entity Framework Core. Ho bisogno di iniziare presto un nuovo progetto che sarà ASP.Net 5, ma non sono sicuro che Entity Framework si adatti al lavoro. L'applicazione attiverà diverse stored procedure al minuto e ho bisogno di parametri di output. EF andrà bene per questo o dovrei usare ADO.Net?
Ho provato FromSql e database.ExecuteSqlCommand ma senza fortuna.
using (AppDbContext db = factory.Create())
{
var in1 = new SqlParameter
{
ParameterName = "ParamIn1",
DbType = System.Data.DbType.Int64,
Direction = System.Data.ParameterDirection.Input
};
var in2 = new SqlParameter
{
ParameterName = "ParamIn2",
DbType = System.Data.DbType.String,
Direction = System.Data.ParameterDirection.Input
};
var out1 = new SqlParameter
{
ParameterName = "ParamOut1",
DbType = System.Data.DbType.Int64,
Direction = System.Data.ParameterDirection.Output
};
var out2 = new SqlParameter
{
ParameterName = "ParamOut2",
DbType = System.Data.DbType.String,
Direction = System.Data.ParameterDirection.Output
};
var result = db.Database.ExecuteSqlCommand("exec spTestSp", in1, in2, out1, out2);
}
Dovrebbe funzionare, ma credo che sia necessario includere anche i nomi dei parametri e la parola chiave OUT
nell'istruzione comando
var sql = "exec spTestSp @ParamIn1, @ParamIn2, @ParamOut1 OUT, @ParamOut2 OUT";
var result = db.Database.ExecuteSqlCommand(sql, in1, in2, out1, out2);
var out1Value = (long) out1.Value;
var out2Value = (string) out2.Value;
Esempio completo della soluzione descritta sopra da @Nkosi e in parte da @Whistler per la facilità dei futuri lettori!
Nel mio esempio, stavo cercando di eseguire una procedura memorizzata nel mio database per ottenere un percorso specifico.
string tableName = "DocumentStore";
string path;
var in1 = new SqlParameter
{
ParameterName = "TableName",
Value = tableName,
Size = Int32.MaxValue,
DbType = System.Data.DbType.String,
Direction = System.Data.ParameterDirection.Input
};
var out1 = new SqlParameter
{
ParameterName = "Path",
DbType = System.Data.DbType.String,
Size = Int32.MaxValue,
Direction = System.Data.ParameterDirection.Output
};
//_context is DbContext Object
_context.Database.ExecuteSqlCommand("EXEC GetFileTableRootPath @TableName, @Path OUT", in1,out1);
path = out1.Value.ToString();