代码之家  ›  专栏  ›  技术社区  ›  SHUBHASIS MAHATA

如何在中使用存储过程。net core 3.0[重复]

  •  0
  • SHUBHASIS MAHATA  · 技术社区  · 7 年前

    我是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");
    }
    

    谢谢

    0 回复  |  直到 8 年前
        1
  •  10
  •   ErikEJ    8 年前

    您可以使用FromSQL方法:

    var blogs = context.Blogs
        .FromSql("EXECUTE dbo.GetMostPopularBlogs")
        .ToList();
    

    https://docs.microsoft.com/en-us/ef/core/querying/raw-sql

        2
  •  8
  •   JsAndDotNet    7 年前

    为了节省别人一个小时左右。。。

    ErikEJ的答案很好,但我有一些额外的工作要做。

    在反向代码优先迁移(到带有存储过程的现有数据库)之后,我遇到了一个问题,即现有数据库上的存储过程没有返回标准表(例如 Blog ),但类别不同(例如 BlogTitleAndSummary )这不在数据库中(因此也不在迁移中)。

    这篇帖子说 must be an entity type 我不确定,但是 another 埃里克斯的帖子为我指明了正确的方向。

    要使此场景正常工作,请执行以下操作:

    我创建了一个“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 queries .

    using (var ctx = new BloggingContext())
    {
    var dbResults = ctx.BlogTitleAndSummary.FromSql("EXEC dbo.get_bloggingSummary @UserId={0}", userId).ToList();
    }
    
    推荐文章