从Entity Framework 3.5调用存储过程

3
我正在使用VS 2010和EF 3.5。我使用“Function Import”功能导入了一个返回GUID列表的存储过程。如何在我的代码中调用它?在实例化“dbcontext”之后,智能感知不会显示我导入的存储过程。我知道在EF 4.0中很容易,但是在这个项目中我被困在EF 3.5上。有什么其他方法可以绕过这个问题而不是使用老式的方法吗?
1个回答

4

我认为EF 4之前的版本无法使用不返回实体的导入存储过程。也就是说,您的存储过程必须返回完整的实体对象,以便EF可以使用它。由于您的过程只返回GUID列表,EF不知道如何使用它。

您可以将以下内容放入数据上下文类中的部分代码中来调用该过程:

    public IEnumerable<Guid> GetMyGUIDs()
    {
        if (this.Connection.State != System.Data.ConnectionState.Open)
            this.Connection.Open();
        var command = new System.Data.EntityClient.EntityCommand
        {
            CommandType = System.Data.CommandType.StoredProcedure,
            CommandText = @"YourContext.YourProcedureName",
            Connection = (System.Data.EntityClient.EntityConnection)this.Connection
        };
        var list = new List<Guid>();
        using (var reader = command.ExecuteReader())
        {
            // get GUID values from the reader here,
            // and put them in the list

            reader.Close();
        }
        return list;
    }

谢谢。所以我需要将您的代码放入部分类中的方法中并返回DbDataReader?我认为DataReader不能从方法返回,因为它需要连接到数据库。您能否请粘贴完整的代码?非常感谢。 - tempid
@enigma -- 请查看更新后的示例。您可以随意操作读取器,并返回任何内容。 - ken
感谢提供更新的代码。如何使其通用化?我还有其他几个需要调用的过程,它们返回具有多列的自定义对象(从不同的表连接而来)。 - tempid
我应该能够从DataReader中提取DataTable并返回它。感谢您指引我正确的方向。此外,我在项目或文件系统中找不到原始的EDMX文件。EF 3.5没有生成它吗? - tempid
默认情况下,原始的.edmx文件在Visual Studio的设计器中打开。要查看其原始XML,请使用文本编辑器打开它,或右键单击->使用XML编辑器打开。 - ken

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接