为了节省别人一个小时左右...
ErikEJ 的答案非常有效,但我首先需要做一些额外的工作。
在反向代码第一次迁移(到具有存储过程的现有数据库)之后,我遇到了一个问题,现有数据库上的存储过程没有返回标准表(例如 list of Blog
),而是一个不同的类(例如 list of BlogTitleAndSummary
)不在数据库中(因此迁移)。
这篇文章说返回必须是一个实体类型,我不确定,但是Eriks 的另一个帖子指出了我正确的方向。
要使此方案正常工作:
我创建了一个“BlogTitleAndSummary”类,将一个属性标记为[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 方法中的参数。不要对此类sql 查询使用字符串插值。
using (var ctx = new BloggingContext())
{
var dbResults = ctx.BlogTitleAndSummary.FromSql("EXEC dbo.get_bloggingSummary @UserId={0}", userId).ToList();
}