我正在使用EF4,我使用POCO实体生成器来创建我的实体。我有一个名为UpdateApplicationState的存储过程。我只传递了2个名为ApplicationID和ApplicationStateID的参数。它什么都不返回,所以我将返回类型设置为None。我只希望它更新应用程序状态ID,没有别的。当我为此存储过程创建函数导入时,我在“函数导入”下的上下文文件中看不到它。为什么是这样?它是在另一个地方创建的吗?我怎么称呼这种方法?
编辑:
这里没有人可以帮助我吗?我想要做的就是调用这个导入函数(不在上下文中),就像我在我的存储库类中执行其他导入函数一样:
public void UpdateApplicationState(int applicationID, int applicationStateID)
{
context.UpdateApplicationState(applicationID, applicationStateID);
}
从我看来:
applicationRepository.UpdateApplicationState(id, newApplicationStateID);
这是我的存储过程:
ALTER PROCEDURE [dbo].[UpdateApplicationState]
(
@ApplicationID INT,
@ApplicationStateID INT
)
AS
BEGIN
UPDATE
[Application]
SET
ApplicationStateID = @ApplicationStateID
WHERE
ApplicationID = @ApplicationID;
END
由于
答案 0 :(得分:5)
问题是EF4 POCO提供的模板不处理没有返回类型的函数导入。您可以设置标量返回类型,也可以修改YourProject.Context.tt文件来解决问题。
在文件中查找以:
开头的部分region.Begin("Function Imports");
然后你会看到一个像这样的代码块:
if (edmFunction.ReturnParameter == null)
{
continue;
}
string returnTypeElement = code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
您可以使用以下内容替换它:
string returnTypeElement = edmFunction.ReturnParameter == null
? null : code.Escape(ef.GetElementType(edmFunction.ReturnParameter.TypeUsage));
然后在接下来的几行中查找returnTypeElement
的两个用法。第一个是方法定义:
<#=Accessibility.ForMethod(edmFunction)#> ObjectResult<<#=returnTypeElement#>>
替换为:
<#=Accessibility.ForMethod(edmFunction)#> <#= returnTypeElement == null ? "int" : ("ObjectResult<" + returnTypeElement + ">") #>
接下来在return语句中还有几行:
return base.ExecuteFunction<<#=returnTypeElement#>>
替换为:
return base.ExecuteFunction<#= returnTypeElement == null ? "" : ("<" + returnTypeElement + ">")#>
现在您应该发现它正确生成函数导入的方法。也许EF4团队会接受这一点,并在下一版本中对我们进行修改。