Sql 存储过程和 Entity framework 6

Sql Stored proc and Entity framework 6

假设我有一个单参数存储过程:

procedure dbo.MyStoredProc @param VARCHAR(50)
as 
SELECT *
FROM whatever
WHERE column = @param

在我的 Web 应用程序中(带有 entity 6 的 mvc)我想调用我的存储过程,并从它的 SELECT 语句中检索所有行。

 var DBLines = MyStoredProc(parameterValue);

我看到了一些令人失望但非常合乎逻辑的东西; 我的 var 包含一个整数。那个整数是 1。它告诉我在我的存储过程中一切正常...

我希望该变量 包含我的存储过程所经历的每一 SQL 行 。我想这是可能的,但如何?必须有一个共同的逻辑。我在互联网上看到的所有...都是解决方法。

这个问题的解决方案是创建一个临时文件table->将结果插入临时文件 table -> select 从临时文件 table

然后删除项目中与此存储过程相关的所有对象,并从数据库更新并再次检查此过程

在您的 sp

上也使用 SET NOCOUNT ON;

经过多次挫折后,我找到了一种方法,但这是另一种解决方法。不过这个对我来说效果很好,它不需要额外的 C# 代码,不需要模型,也不需要 public class FunctionsContext : BaseContext<FunctionsContext>{} 之类的东西……

在 SQL 服务器中,我创建了一个空的 table,看起来就像我的存储过程的 return。假设我的存储过程是 return :

SELECT nvarchar(2), int, datetime FROM whatever WHERE <condition>

然后我的 Empty_Table 是用相同的 var 类型创建的。在使用 Entity framework 映射向导映射我的 Empty_Table 之后。我可以将它用作对此的类型:

databaseEntities db = new databaseEntities();

var query = db.Database.SqlQuery<Empty_Table>("EXEC [dbo].[My_Stored_Proc] @p1", new SqlParameter("p1", parameterValue));

foreach (var line in query)
{
    int i = line.ID
}

而且效果很好。这将是我使用实体存储过程的主要(唯一)技术。

编辑(已正确解决):

问题在最新版本的实体中已经完全解决,如果你把你的EDMX文件放在模型文件夹中,那么你可以在上下文菜单中导入存储过程。 EF 会自动做 3 件事 :

  1. 创建一个新的复杂对象,表示名为 result_NameOfStoredProc 的存储过程的结果。

  2. 将过程的定义放入模型中。

  3. 创建函数以使用存储过程。

所以没有更多的解决方法。就是这样。

编辑 2(沼泽)

出于某种原因,我在存储过程中引入临时 table 后,我的第一个编辑(好的解决方案)就被破坏了。

只有当它不包含临时 table 时,我才能正确导入我的存储过程,我通过

对其进行了测试
  1. 正在从模型文件夹中的 .edmx 文件中删除我的复合类型、函数输入和过程。

  2. 在存储过程中添加这两行:

    CREATE TABLE #TableVariable (cmpt nvarchar(18))

    insert into #TableVariable select cmpt from TA where NomReseau = @user

  3. 使用 .edmx 文件的上下文菜单重新导入程序

然后繁荣。不再创建 result_NameOfStoredProc 个对象...取而代之的是一个烦人的 int,就像以前一样。我不得不修改整个查询以将对这个临时 table 的所有调用替换为其他内容(逻辑上,一个变量 table),然后保存它,然后导入,然后将过程改回......很多有趣...这是一场灾难。

编辑 3(沼泽)

好吧...我还有另一个问题,其中实体无法创建我需要的结果对象,我认为这是因为我使用的数据库比其他数据库旧。所以我创建了一个 class 来补偿,我使用了我的第一个解决方案的代码。有时别无他法。我希望 Entity 始终像我第一次编辑时那样工作,但我不能指望它。