Sono nuovo di EF Core 2.0 con stored procedure.
Qualcuno può aiutare a utilizzare la stored procedure nel mio approccio code-first EF Core 2.0?
Con il mio progetto precedente, avevo un file modello .edmx
e stavo usando il contesto come di seguito:
public IEnumerable<UserResult> GetUserResults(Entities context)
{
if (context == null) return new List<UserResult>();
return context.spGetUsers().Where(u => u.IsDeleted == false);
}
e il contesto è:
public virtual ObjectResult<UserResult> spGetUsers()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<UserResult>("spGetUsers");
}
Grazie
È possibile utilizzare il metodo FromSQL:
var blogs = context.Blogs
.FromSql("EXECUTE dbo.GetMostPopularBlogs")
.ToList();
Per salvare qualcun altro circa un'ora ...
La risposta di ErikEJ funziona perfettamente, ma ho avuto del lavoro extra da fare prima.
Dopo la prima migrazione di un codice inverso (a un database esistente con stored procedure), ho avuto un problema in cui le stored procedure su un database esistente non hanno restituito la tabella standard (ad esempio l'elenco di Blog
), ma una classe diversa (ad esempio l'elenco di BlogTitleAndSummary
) che non era nel database (e quindi nella migrazione).
Questo post ha dichiarato che il reso deve essere di tipo entità , di cui non ero sicuro, ma un altro post di Eriks mi ha indirizzato nella giusta direzione.
Per far funzionare questo scenario:
Ho creato una classe di "BlogTitleAndSummary", contrassegnando una proprietà come [key]
.
per esempio
public class BlogTitleAndSummary
{
[Key]
public int BlogId { get; set; }
public string Title { get; set; }
public string ShortSummary { get; set; }
}
Quindi, l'ho aggiunto come DbSet sul contesto es
public partial class BloggingContext : DbContext
{
public BloggingContext()
{
}
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{
}
// Might be best to move these to another partial class, so they don't get removed in any updates.
public virtual DbSet<BlogTitleAndSummary> BlogTitleAndSummary { get; set; }
// Standard Tables
public virtual DbSet<Blog> Blog { get; set; }
...
}
Questo mi ha permesso di usare la seguente sintassi per chiamare le stored procedure:
NOTA: ho aggiornato questo seguendo il commento qui sotto. Utilizzare i parametri nel metodo FromSql. Non utilizzare l'interpolazione delle stringhe per tali query SQL .
using (var ctx = new BloggingContext())
{
var dbResults = ctx.BlogTitleAndSummary.FromSql("EXEC dbo.get_bloggingSummary @UserId={0}", userId).ToList();
}