【问题标题】:How do I run a stored procedure in ADO.NET Entity Framework?如何在 ADO.NET Entity Framework 中运行存储过程?
【发布时间】:2009-06-13 20:00:35
【问题描述】:

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

我的表:我的客户

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>

添加没问题。每个添加的过程都可以。但编辑后出现上述错误。

【问题讨论】:

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


    【解决方案1】:

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

    DataContext.MyFunctionName(storedProcedureParamer1, storedProcedureParamer2)
    

    How to: Import a Stored Procedure

    【讨论】:

      【解决方案2】:

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

      return base.ExecuteFunction("MyCustomerAdd", nameParameter, surNameParameter);
      
      ALTER procedure [dbo].[proc_MyCustomerAdd]
      

      你可以尝试使用:

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

      这有什么不同吗?

      马克

      【讨论】:

      • 我找到了解决方案。非常感谢。
      • 您可以在 C# 中更改 sp 名称" proc_MyCustomerAdd--->MyCustomerAdd"
      • 是的,您可以在 C# 中更改过程的名称 - 但存储过程仍称为“proc_MyCustomerAdd”,并且在调用 base.ExecuteFunction 时,我知道您必须为其命名存储过程 - 无论你的 C# 函数被调用什么......
      • @Penguen 如果您“找到解决方案”,您应该将其作为答案发布并接受以供其他人查看。
      【解决方案3】:

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

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

      对于执行非查询操作(事务),您可以使用

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-02
        • 2020-03-05
        • 1970-01-01
        相关资源
        最近更新 更多