【问题标题】:Sql Stored proc and Entity framework 6Sql 存储过程和实体框架 6
【发布时间】:2016-10-03 16:28:43
【问题描述】:

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

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

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

 var DBLines = MyStoredProc(parameterValue);

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

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

【问题讨论】:

  • 你错过了很多信息。也许先检查这个问题。 stackoverflow.com/questions/20970416/…
  • 已经看到了,而且不是很清楚,而且我通常不需要任何模型来访问我的数据。必须有一种方法来调用存储过程并获取它选择的所有内容。不管怎样,我现在要试试这个
  • 嗯,MVC 背后的想法是你应该有一个模型。但是,如果您阅读下面将显示如何使用参数调用它。 stackoverflow.com/a/20972897/3470178
  • 是的,更像是它,它还没有工作,但我应该能够修复它,谢谢
  • 您是否将存储过程作为函数导入?也看看这个问题:stackoverflow.com/questions/32140774/…

标签: c# asp.net sql-server asp.net-mvc-3 entity-framework-6


【解决方案1】:

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

在 SQL Server 中,我创建了一个看起来就像我的存储过程返回的空表。假设我的存储过程要返回:

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

然后我的 Empty_Table 使用相同的 var 类型创建。在使用实体框架映射向导映射我的 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
}

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

编辑(已正确解决):

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

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

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

  3. 创建一个函数来使用存储过程。

所以没有更多的解决方法。这就是要走的路。

编辑 2(沼泽)

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

只有当它不包含临时表时,我才能正确导入我的存储过程,我测试了它

  1. 从模型文件夹中的.edmx 文件中删除我的复合体类型、函数导入和过程。

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

    CREATE TABLE #TableVariable (cmpt nvarchar(18))

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

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

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

编辑 3(沼泽)

嗯...我有另一个沼泽实体无法创建我需要的结果对象,我认为这是因为我使用的数据库比我的其他数据库旧。所以我创建了一个类来补偿,我使用了我的第一个解决方案的代码。有时没有其他办法。我希望 Entity 始终像我的第一次编辑一样工作,但我不能指望这一点。

【讨论】:

    【解决方案2】:

    这个问题的解决方案是通过创建一个临时表->将结果插入临时表->从临时表中选择

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

    在你的 sp 上也使用SET NOCOUNT ON;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多