ストアドプロシージャを使用してEF Core 2.0を初めて使用します。
EF Core 2.0のコードファーストアプローチでストアドプロシージャを使用する方法を教えてください。
以前のプロジェクトでは、.edmx
モデルファイル、次のようにコンテキストを使用していました。
public IEnumerable<UserResult> GetUserResults(Entities context)
{
if (context == null) return new List<UserResult>();
return context.spGetUsers().Where(u => u.IsDeleted == false);
}
コンテキストは次のとおりです。
public virtual ObjectResult<UserResult> spGetUsers()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<UserResult>("spGetUsers");
}
ありがとう
FromSQLメソッドを使用できます。
var blogs = context.Blogs
.FromSql("EXECUTE dbo.GetMostPopularBlogs")
.ToList();
他の人を1時間ほど救うには...
ErikEJの答えは完璧に機能しますが、最初にやることがいくつかあります。
(ストアドプロシージャを含む既存のデータベースへの)リバースコードの最初の移行後、既存のデータベースのストアドプロシージャが標準テーブル(Blog
のリスト)を返さず、別のクラスを返すという問題がありました(例:BlogTitleAndSummary
のリスト)。これはデータベースにありませんでした(したがって、移行)。
この投稿では、 エンティティタイプである必要があります がわかりませんでしたが、Eriksの投稿の another は正しい方向を示しました。
このシナリオを機能させるには:
「BlogTitleAndSummary」のクラスを作成し、1つのプロパティを[key]
。
例えば.
public class BlogTitleAndSummary
{
[Key]
public int BlogId { get; set; }
public string Title { get; set; }
public string ShortSummary { get; set; }
}
次に、それをコンテキストのDbSetとして追加しました。
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; }
...
}
これにより、ストアドプロシージャを呼び出すために次の構文を使用できました。
注:以下のコメントに従ってこれを更新しました。 FromSqlメソッドでparamsを使用します。このような SQLクエリ には文字列補間を使用しないでください。
using (var ctx = new BloggingContext())
{
var dbResults = ctx.BlogTitleAndSummary.FromSql("EXEC dbo.get_bloggingSummary @UserId={0}", userId).ToList();
}