存储过程参数名称和实体框架

时间:2011-04-29 14:10:08

标签: c# .net sql-server stored-procedures entity-framework-4

我从SQL Server 2005数据库生成了一个Entity Framework模型,并开始导入存储过程。到目前为止一切都很好,但是当我尝试运行它时,其中一个存储过程会引发异常:

过程或函数'csp_getCoworker'需要参数'@@ firstname',这是未提供的。

以下是存储过程的签名:

ALTER PROCEDURE [dbo].[csp_getCoworker](
@@firstname nvarchar(32),
@@lastname nvarchar(32),
@@businessarea nvarchar(512),
@@location nvarchar(512)
)

以下是Entity Framework

生成的代码
ObjectParameter p_firstnameParameter;
if (p_firstname != null)
{
    p_firstnameParameter = new ObjectParameter("p_firstname", p_firstname);
}
    else
{
     p_firstnameParameter = new ObjectParameter("p_firstname", typeof(global::System.String));
}
[...]
return base.ExecuteFunction<csp_getCoworker_Result2>("csp_getCoworker", p_firstnameParameter, p_lastnameParameter, p_businessareaParameter, p_locationParameter);

参数名称中的double @ -characters是否会搞乱?

1 个答案:

答案 0 :(得分:2)

我刚试过这个,因为这是非常罕见的情况。

存储过程遵循非常奇怪的命名约定,因为不应使用@@。它默认由某些SQL服务器系统变量使用,不应用于其他任何内容。使用@x作为存储过程的参数定义参数x,但使用@@x将定义参数@x - @是参数名称的一部分!

这是C#中的一个非常大的问题,因为@是用于定义与保留关键字相同的变量名称的转义字符。例如:

string @string = "abc";

定义名为string的变量。变量名不能以@开头。

实体框架通过将所有@替换为_并在SSDL中直接将参数的名称加上p来处理此问题。原因是从SSDL映射存储过程创建的函数导入必须具有与过程同名的参数,但同时@不允许起始字符。如果您尝试手动修改EDMX,它将无法通过自己的XSD验证,因为@不允许为CSDL中定义的标识符启动字符。

即使这可能被视为一个错误,更多的是缺少更改CSDL中参数名称的可能性。目前这是设计的,唯一的方法是纠正SQL存储过程中的参数名称。