使用entity framework从存储过程获取数据

我试图从数据库上下文对象(使用Entity Framework 6.1.1)调用dynamicSQL存储过程来获取内容的表,以填充GridView控件。 我无法检索数据。

这是存储过程。 这是一个关于存储过程中的SQL注入的学生演示,所以我知道这是可注射的,没关系。

 ALTER PROCEDURE dbo.SearchProducts @SearchTerm VARCHAR(max) AS BEGIN DECLARE @query VARCHAR(max) SET @query = 'SELECT * FROM dbo.Products WHERE Name LIKE ''%' + @SearchTerm + '%''' EXEC(@query) END 

我后面用来执行存储过程的C#代码是:

 var db = new MyEntities(); var TEST_SEARCH_TERM = "product"; var result = db.SearchProducts(TEST_SEARCH_TERM); MyGridView.DataSource = result; MyGridView.DataBind(); 

执行时,在Visual Studio的数据库资源pipe理器中,存储过程正常工作。 但是当在正在运行的ASP.NET应用程序中执行时,我在DataBind()方法中得到一个exception,因为result返回-1而不是包含存储过程的SELECT产生的对象的IEnumerable DataSet

我如何检索数据并填充我的GridView

使用以下步骤解决此问题:

  1. 您需要导入存储过程作为一个函数。 右键单击实体模型的工作空间区域,然后selectAdd -> Function Import
  2. 在“添加function导入”对话框中,input要在模型中引用存储过程的名称,例如Search_Products ,从下拉列表中select您的过程,然后select过程的返回值为Entities然后从中selectProducts下拉列表。
  3. 然后在后面的代码中:

     var db = new MyEntities(); var TEST_SEARCH_TERM = "product"; var result = db.Search_Products(TEST_SEARCH_TERM);//Search_Products is the name that you specified in Function Import dialog MyGridView.DataSource = result; MyGridView.DataBind(); 

结果为-1的原因是entity framework不支持存储过程返回值。 我认为支持存储过程的返回值取决于entity framework的版本。 此外,entity framework不具有丰富的存储过程支持,因为它是一个ORM,而不是SQL替代。

我之前遇到过使用dynamicSQL的存储过程。 如果我添加'SET FMTONLY OFF'行,我已经成功地使用了复杂types。 (请参阅https://msdn.microsoft.com/en-us/library/ms173839.aspx ),然后将其添加到EF模型中。 一旦你有你的复杂types的模型设置,一定要删除这一行。

例:

 ALTER PROCEDURE dbo.SearchProducts @SearchTerm VARCHAR(max) AS BEGIN SET FMTONLY OFF; DECLARE @query VARCHAR(max) SET @query = 'SELECT * FROM dbo.Products WHERE Name LIKE ''%' + @SearchTerm + '%''' EXEC(@query) END 

validation你的EDMX有一个返回types:去function导入 – > SearchProducts,并双击它。

为了使用Complex返回types,Entity Framework将要求您在存储过程中明确定义列名,而不是使用*。

一旦您的存储过程被修改以定义列名称,您可以在项目中更新您的模型。 (注意,执行SP的完整删除,然后将其添加回您的edmx可能是最佳路线。)

编辑

也许你可以像下面这样修改你的SP:

 ALTER PROCEDURE dbo.SearchProducts @SearchTerm VARCHAR(max) AS BEGIN SELECT * FROM dbo.Products WHERE Name LIKE '%' + @SearchTerm + '%' END 

您似乎已经排除了您的问题,有Microsoft的官方文档在下面的链接可用:

如何将存储过程导入到实体数据模型中: https : //msdn.microsoft.com/en-us/library/vstudio/bb896231(v=vs.100).aspx

EFdevise器中的复杂types: https : //msdn.microsoft.com/en-gb/data/jj680147.aspx

确保您正在使用.net的最新版本,并且在更改数据库时保持模型最新。