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 件事 :
创建一个新的复杂对象,表示名为 result_NameOfStoredProc
的存储过程的结果。
将过程的定义放入模型中。
创建函数以使用存储过程。
所以没有更多的解决方法。就是这样。
编辑 2(沼泽)
出于某种原因,我在存储过程中引入临时 table 后,我的第一个编辑(好的解决方案)就被破坏了。
只有当它不包含临时 table 时,我才能正确导入我的存储过程,我通过
对其进行了测试
正在从模型文件夹中的 .edmx
文件中删除我的复合类型、函数输入和过程。
在存储过程中添加这两行:
CREATE TABLE #TableVariable (cmpt nvarchar(18))
insert into #TableVariable select cmpt from TA where NomReseau = @user
使用 .edmx
文件的上下文菜单重新导入程序
然后繁荣。不再创建 result_NameOfStoredProc
个对象...取而代之的是一个烦人的 int,就像以前一样。我不得不修改整个查询以将对这个临时 table 的所有调用替换为其他内容(逻辑上,一个变量 table),然后保存它,然后导入,然后将过程改回......很多有趣...这是一场灾难。
编辑 3(沼泽)
好吧...我还有另一个问题,其中实体无法创建我需要的结果对象,我认为这是因为我使用的数据库比其他数据库旧。所以我创建了一个 class 来补偿,我使用了我的第一个解决方案的代码。有时别无他法。我希望 Entity 始终像我第一次编辑时那样工作,但我不能指望它。
假设我有一个单参数存储过程:
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 件事 :
创建一个新的复杂对象,表示名为
result_NameOfStoredProc
的存储过程的结果。将过程的定义放入模型中。
创建函数以使用存储过程。
所以没有更多的解决方法。就是这样。
编辑 2(沼泽)
出于某种原因,我在存储过程中引入临时 table 后,我的第一个编辑(好的解决方案)就被破坏了。
只有当它不包含临时 table 时,我才能正确导入我的存储过程,我通过
对其进行了测试正在从模型文件夹中的
.edmx
文件中删除我的复合类型、函数输入和过程。在存储过程中添加这两行:
CREATE TABLE #TableVariable (cmpt nvarchar(18))
insert into #TableVariable select cmpt from TA where NomReseau = @user
使用
.edmx
文件的上下文菜单重新导入程序
然后繁荣。不再创建 result_NameOfStoredProc
个对象...取而代之的是一个烦人的 int,就像以前一样。我不得不修改整个查询以将对这个临时 table 的所有调用替换为其他内容(逻辑上,一个变量 table),然后保存它,然后导入,然后将过程改回......很多有趣...这是一场灾难。
编辑 3(沼泽)
好吧...我还有另一个问题,其中实体无法创建我需要的结果对象,我认为这是因为我使用的数据库比其他数据库旧。所以我创建了一个 class 来补偿,我使用了我的第一个解决方案的代码。有时别无他法。我希望 Entity 始终像我第一次编辑时那样工作,但我不能指望它。