为了节省其他人一个小时左右的时间...
ErikEJ的答案是完美的,但我需要做一些额外的工作。
在进行反向代码迁移(到具有存储过程的现有数据库)之后,我遇到了一个问题,即现有数据库上的存储过程没有返回标准表格(例如
Blog
列表),而是一个不同的类(例如
BlogTitleAndSummary
列表),这个类不在数据库中(因此也不在迁移范围内)。
此帖子指出返回值
必须是实体类型,我对此表示怀疑,但Eriks的
另一个帖子为我指明了方向。
为了让这种情况正常工作:
我创建了一个"BlogTitleAndSummary"类,并将其中一个属性标记为
[key]
。
例如:
public class BlogTitleAndSummary
{
[Key]
public int BlogId { get; set; }
public string Title { get; set; }
public string ShortSummary { get; set; }
}
然后,我将其作为Context的DbSet添加,例如:
public partial class BloggingContext : DbContext
{
public BloggingContext()
{
}
public BloggingContext(DbContextOptions<BloggingContext> options)
: base(options)
{
}
public virtual DbSet<BlogTitleAndSummary> BlogTitleAndSummary { get; set; }
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();
}