2011-04-29 42 views
1

我已经从SQL Server 2005数据库生成实体框架模型并开始导入存储过程。到目前为止这么好,但是其中一个存储过程抛出一个异常,当我尝试运行它时:存储过程参数名称和实体框架

过程或函数'csp_getCoworker'需要参数'@@ firstname',它没有提供。

这里是存储过程的签名:

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

,这里是由实体框架生成的代码

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); 

是它在参数名称的双重@ -characters多数民众赞成搞乱东西了吗?

回答

2

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

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

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

string @string = "abc"; 

定义变量命名string。变量名称不能以@开头。

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

即使这大概可以看作是了解缺失可能改变CSDL参数的名称的错误。目前,这是设计的,唯一的方法是纠正SQL存储过程中参数的名称。

+0

这是一个很好的答案!它给了我在正确的方向一推,我写的包装程序,正确命名变量刚刚过去他们到相应的SP解决了这个问题。 – 2011-05-04 09:34:40

+2

@Bartek:你应该* *做的是找到谁决定这是一个好主意,在它们的参数名称使用双@ -marks,耳光他们,然后让他们解决这个问题。 – 2011-09-05 19:16:47

+0

@Matti:我试过了,但他们已经长期以来离开组织。 > :( – 2011-09-08 09:52:27