在 Entity Framework Core 2.0 中执行存储过程

Posted

技术标签:

【中文标题】在 Entity Framework Core 2.0 中执行存储过程【英文标题】:Executing Stored Procedure in Entity Framework Core 2.0 【发布时间】:2018-08-13 16:24:24 【问题描述】:

有一个场景来执行存储过程并读取 EF Core 中的返回值,即返回单个值。

我尝试使用此代码,但这不起作用。我了解ExecuteSqlCommand 不适用于选择,只能用于更新数据库。

var test =  context.Database.ExecuteSqlCommand("SPName");

存储过程只有一个像Select 'somevalue'这样的select语句

寻找任何替代方法来获取存储过程返回的数据。

【问题讨论】:

【参考方案1】:
DbCommand cmd = ctx.Database.GetDbConnection().CreateCommand();
cmd.CommandText = "SPName";
cmd.CommandType = CommandType.StoredProcedure;

    if (cmd.Connection.State != ConnectionState.Open)
    
        cmd.Connection.Open();
    

return await cmd.ExecuteNonQueryAsync();

这是一篇关于此的帖子: https://nodogmablog.bryanhogan.net/2016/07/entity-framework-core-and-calling-a-stored-proceduce/#comment-60582

【讨论】:

【参考方案2】:

能够用下面的代码解决我的问题。这是基于以下回复中给出的建议。

using (var command = context.Database.GetDbConnection().CreateCommand())
    
        command.CommandText = "StoredProcedureName";
        command.CommandType = CommandType.StoredProcedure;

        context.Database.OpenConnection();

        var dataReader = command.ExecuteReader();

        if (dataReader.Read())
        
            string _test = dataReader.GetString(dataReader.GetOrdinal("ColumnName"));
        
    

【讨论】:

【参考方案3】:

查看来自 MS 的文档:https://docs.microsoft.com/en-us/ef/core/querying/raw-sql

var blog = context.Blogs
    .FromSql("EXECUTE dbo.GetMostPopularBlogs")
    .SingleOrDefault();

他们有一个充满示例的 git 存储库:https://github.com/aspnet/EntityFramework.Docs/blob/master/samples/core/Querying/Querying/RawSQL/Sample.cs

要在 EF Core 中使用存储过程,请观看此视频:https://www.youtube.com/watch?v=bX3BPSbvofE

【讨论】:

FromSql 仅适用于实体,在我的情况下,我没有实体可以查询数据。返回值的是数据库中的SP msdn.microsoft.com/en-us/library/…该方法的返回结果是int32。 如果你不使用实体..那么你不需要 EF。一个快速的谷歌发现了这个视频。 youtube.com/watch?v=bX3BPSbvofE 谢谢。会检查的。但是在基于.Net Framework的EF中执行SP很容易,检查.Net core中是否有类似的功能 视频链接帮助解决了问题。谢谢。【参考方案4】:

请按以下步骤操作:

第一步:创建模型类

  public class SP_GetService
  
        [Key]
        public int ServiceId  get; set; 
        public string ServiceAcronym  get; set; 
        public string ServiceDescription  get; set; 
    

第二步:在上下文文件中创建数据库集

public virtual DbSet<SP_GetService> SP_GetServices  get; set; 

第三步:执行程序

using (var _context = new SampleContext())

 var data = _context.SP_GetServices.FromSql("EXECUTE GetService @Param=0", "value").ToList();

【讨论】:

出现此错误“DbSet”不包含“FromSql”的定义,并且无法找到接受“DbSet”类型的第一个参数的可访问扩展方法“FromSql”。我正在使用 EF 5

以上是关于在 Entity Framework Core 2.0 中执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Entity Framework Core 2 中播种?

在 Entity Framework Core 2.0 中执行存储过程

Entity Framework Core 2.1 中的 ReverseEngineeringGenerator

DetachedLazyLoadingWarning 的 Entity Framework Core 2.1 问题

Entity Framework Core 2 - 外键约束

Entity Framework Core 2.1 无法更新具有关系的实体