如何在ADO.NET实体框架中运行存储过程?

时间:2009-06-13 20:00:35

标签: c# .net linq-to-sql entity-framework

如何在ADO.NET Entity Framework中使用存储过程?

我的表:MyCustomer

Columns:
CustomerID    PK   int 
Name               nvarchar(50)
SurName            nvarchar(50)

我的存储过程

ALTER procedure [dbo].[proc_MyCustomerAdd]
(@Name nvarchar(50),
@SurName nvarchar(50)
)
as 
begin
  insert into dbo.MyCustomer([Name], SurName) values(@name,@surname)
end

我的C#代码

private void btnSave_Click(object sender, EventArgs e)
{
   entityContext.MyCustomerAdd(textName.Text.Trim(), textSurName.Text.Trim());
   entityContext.SaveChanges();
}

错误:

  

数据阅读器与指定的内容不兼容   'TestAdonetEntity2Model.MyCustomer'。一个   类型为“CustomerID”的成员   没有相应的列   具有相同名称的数据阅读器。

在最后一个代码行(调用ExecuteFunction)下面发生错误:

global::System.Data.Objects.ObjectParameter surNameParameter;
if ((surName != null))
{
   surNameParameter = new global::System.Data.Objects.ObjectParameter("SurName", surName);
}
else
{
   surNameParameter = new global::System.Data.Objects.ObjectParameter("SurName", typeof(string));
}
<b>return base.ExecuteFunction<MyCustomer>("MyCustomerAdd", nameParameter, surNameParameter);</b>

添加即可。每个添加的过程都可以。但编辑后,会出现上述错误。

4 个答案:

答案 0 :(得分:2)

我认为您需要使用EF工具进行功能导入并调用导入的函数,如

DataContext.MyFunctionName(storedProcedureParamer1, storedProcedureParamer2)

How to: Import a Stored Procedure

答案 1 :(得分:0)

只是一个疯狂的猜测(我没有在存储过程中使用EF):“ExecuteFunction”中使用的函数名称是否必须与存储过程的名称相同?

return base.ExecuteFunction("MyCustomerAdd", nameParameter, surNameParameter);

ALTER procedure [dbo].[proc_MyCustomerAdd]

您可以尝试使用:

return base.ExecuteFunction("proc_MyCustomerAdd", nameParameter, surNameParameter);

这有什么不同吗?

马克

答案 2 :(得分:0)

要为查询操作调用存储过程,您可以在Entityframework中使用SqlQuery,这非常有用

_dbContext.Database.SqlQuery<EntityType>("sp_name",parameters).ToList();

对于Executenonquery Operations(Transactions),您可以使用

_dbContext.Database.ExecuteSqlCommand( 
                    @"UPDATE tblname SET Rating = 5" + 
                        " WHERE Name LIKE '%Entity Framework%'" 
                    );

请注意,Context类的_dbContext对象继承自Entityframework的DbContext类

答案 3 :(得分:-3)

try
{
    entityContext.MyCustomerAdd(textName.Text.Trim(), textSurName.Text.Trim())
}
catch (Exception ex)
{
    ;
}

已正确添加流程运行。另一方面 ;添加进程后,给出上面的错误。但是我的解决方案运行正确!!!