假设我有一个单参数存储过程:
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 行。我想这是可能的,但如何?必须有一个共同的逻辑。我在互联网上看到的所有...都是解决方法。
最佳答案
经过多次挫折后,我找到了一种方法,但这是另一种解决方法。不过这个对我来说效果很好,它不需要额外的 C# 代码,不需要模型,也不需要 public class FunctionsContext : BaseContext<FunctionsContext>{}
这样的东西。不管是什么...
在 SQL Server 中,我创建了一个空表,它看起来就像我的存储过程的返回值。假设我的存储过程要返回:
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(沼泽)
出于某种原因,在我的存储过程中引入临时表后,我的第一个编辑(好的解决方案)就被破坏了。
只有当它不包含临时表时,我才能正确导入我的存储过程,我通过
对其进行了测试从我的
.edmx
中删除我的复合类型、函数输入和过程模型文件夹中的文件。在存储过程中添加这两行:
CREATE TABLE #TableVariable (cmpt nvarchar(18))
insert into #TableVariable select cmpt from TA where NomReseau = @user
使用
.edmx
重新导入程序文件的上下文菜单
然后繁荣。没有了 result_NameOfStoredProc
object created... 一个烦人的 int,就像以前一样。我不得不修改整个查询以将对这个临时表的所有调用替换为其他东西(逻辑上,一个变量表),然后保存它,然后导入,然后将过程改回来......很有趣......这是一场灾难.
编辑 3(沼泽)
嗯...我有另一个实体无法创建我需要的结果对象的问题,我认为这是因为我使用的数据库比其他数据库旧。所以我创建了一个类来补偿并使用了我的第一个解决方案的代码。有时别无他法。我希望实体始终像我第一次编辑时那样工作,但我不能指望这一点。
关于c# - Sql 存储过程和 Entity Framework 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37617199/