C# 如何访问';结果'';消息';,和';返回值';使用实体框架4的存储过程的? 问题:

C# 如何访问';结果'';消息';,和';返回值';使用实体框架4的存储过程的? 问题:,c#,.net,entity-framework,c#-4.0,entity-framework-4,C#,.net,Entity Framework,C# 4.0,Entity Framework 4,如何使用Entity Framework 4.4和C#4.0访问存储过程的“结果”、“消息”和“返回值” 下面是采用三个参数的存储过程。我希望,当我运行存储过程时,我应该能够访问“结果”、“消息”和“返回值”的所有三个值 有人能帮我弄清楚如何用EF做到这一点吗?使用EF生成的代码,我似乎只能访问查询的“结果”(返回的行) 存储过程 代码 public virtual ObjectResult THIS_PROCEDURE_方法(字符串第一、字符串第二、字符串第三) { var FIRST_P

如何使用Entity Framework 4.4和C#4.0访问存储过程的“结果”、“消息”和“返回值”

下面是采用三个参数的存储过程。我希望,当我运行存储过程时,我应该能够访问“结果”、“消息”和“返回值”的所有三个值

有人能帮我弄清楚如何用EF做到这一点吗?使用EF生成的代码,我似乎只能访问查询的“结果”(返回的行)

存储过程 代码
public virtual ObjectResult THIS_PROCEDURE_方法(字符串第一、字符串第二、字符串第三)
{  
var FIRST_PARAM=FIRST!=null?
新的ObjectParameter(“第一个”,第一个):
新的ObjectParameter(“FIRST”,typeof(string));
var SECOND_PARAM=SECOND!=null?
新的ObjectParameter(“第二个”,第二个):
新的ObjectParameter(“第二个”,typeof(string));
var THIRD_PARAM=THIRD!=null?
新的ObjectParameter(“第三个”,第三个):
新的ObjectParameter(“第三个”,typeof(string));
返回((IObjectContextAdapter)this.ObjectContext.ExecuteFunction(“此过程”,第一个参数,第二个参数,第三个参数);
}  
所以,首先要做的事情:-)在回答问题的三个部分之前,我只想确定我们在同一页上。EF被设计成ORM(对象关系映射器)。这意味着它的目的是将关系数据转换为代码对象(反之亦然)。它使用的机制是结果集(而不是返回值)。因此,EF中的大多数管道都是专门设计用于对结果集进行操作的,也可以自动生成SQL以获取这些结果集。然而,由于人们的要求,EF现在有能力执行存储过程,但这种能力并不全面,对产品的主要功能来说是一种副作用。话虽如此,EF确实在幕后使用了ADO.NET,而这正是您将得到答案的地方,因为ADO.NET确实可以处理您的所有场景

第一个问题——如何获得结果。在这种情况下,EF将执行SP,并且可能会将其映射到具有与结果列匹配的属性的某个对象。这意味着EF将创建对象的集合(更精确地说是可枚举查询结果集),每个对象表示结果中的一行数据。在您的情况下,方法的返回是ObjectResult。ObjectResult是对象的集合,每个项的类型都是THIS_PROCEDURE_RESULT,而THIS_PROCEDURE又具有结果的每个映射列的属性

第二个问题-如何获取消息。如果Raiserror在一定的严重性范围内使用,将导致ADO.NET引发异常(类型为SqlException)。EF将只是表面(通过)那个错误。该SQLException实例将包含所有错误和消息信息。要查看它,您只需捕获错误:

try
{
    // call EF SP method here...
}
catch(SqlException se)
{
    Debug.WriteLine(se.Message);
}
catch(Exception e)
{
    // all non-DB errors will be seen here...
}
但是,如果Raiserror语句具有警告或信息严重性,ADO.NET将不会引发异常。在这种情况下,您必须使用connection对象的事件来查看数据库中的信息和警告消息。要在EF中执行此操作,必须从EF对象上下文获取EntityConnection,然后从EntityConnection获取存储连接。如果您使用的是SQL Server(SqlClient ADO.NET提供程序),则这将是一个SqlConnection实例。该实例包含一个名为InfoMessage的事件。您可以将事件处理程序连接到该事件以捕获消息。更多信息请点击此处:


最后一个问题-如何获取返回值。这个会很烂的。根据我的第一段,EF并不是专门用来处理SP调用的。虽然它将结果集映射到对象集合,但不处理来自SP的返回值。为了访问SqlCommand对象的参数集合,必须使用不带EF层的ADO.NET。其中一个参数为参数类型ReturnValue,它将包含返回值本身。

感谢您提供如此详细的答案。非常感谢您抽出时间。非常感谢!至于获取消息,至少在EF6中要容易得多(而且没有像上面描述的那样工作)。var con=context.Database.Connection作为SqlConnection;然后con.InfoMessage+=(s,e)=>{System.Diagnostics.Debug.WriteLine(e.Message);}。。。格式可能已完全损坏..EF未返回存储过程返回值的问题是否已通过EF 6.1.3修复?
public virtual ObjectResult<THIS_PROCEDURE_RESULT> THIS_PROCEDURE_METHOD(string FIRST, string SECOND, string THIRD)  
{  
    var FIRST_PARAM = FIRST != null ?  
        new ObjectParameter("FIRST", FIRST) :  
        new ObjectParameter("FIRST", typeof(string));  

    var SECOND_PARAM = SECOND != null ?  
        new ObjectParameter("SECOND", SECOND) :  
        new ObjectParameter("SECOND", typeof(string));  

    var THIRD_PARAM = THIRD != null ?  
        new ObjectParameter("THIRD", THIRD) :  
        new ObjectParameter("THIRD", typeof(string));  

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<THIS_PROCEDURE_RESULT>("THIS_PROCEDURE", FIRST_PARAM, SECOND_PARAM, THIRD_PARAM);  
}  
try
{
    // call EF SP method here...
}
catch(SqlException se)
{
    Debug.WriteLine(se.Message);
}
catch(Exception e)
{
    // all non-DB errors will be seen here...
}