我从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是否会搞乱?
答案 0 :(得分:2)
我刚试过这个,因为这是非常罕见的情况。
存储过程遵循非常奇怪的命名约定,因为不应使用@@。它默认由某些SQL服务器系统变量使用,不应用于其他任何内容。使用@x
作为存储过程的参数定义参数x
,但使用@@x
将定义参数@x
- @是参数名称的一部分!
这是C#中的一个非常大的问题,因为@是用于定义与保留关键字相同的变量名称的转义字符。例如:
string @string = "abc";
定义名为string
的变量。变量名不能以@开头。
实体框架通过将所有@
替换为_
并在SSDL中直接将参数的名称加上p
来处理此问题。原因是从SSDL映射存储过程创建的函数导入必须具有与过程同名的参数,但同时@不允许起始字符。如果您尝试手动修改EDMX,它将无法通过自己的XSD验证,因为@不允许为CSDL中定义的标识符启动字符。
即使这可能被视为一个错误,更多的是缺少更改CSDL中参数名称的可能性。目前这是设计的,唯一的方法是纠正SQL存储过程中的参数名称。