我试图在我的Entity Framaework 4中使用存储过程。如何从实体框架调用没有返回数据的存储过程?
我已经创建了实体模型,并可以在Stored Procedure文件夹中的模型浏览器中看到存储的过程。
我通过功能导入添加了存储过程。我存储的proc没有返回类型。现在,当我试图在对象上下文(业务层)中调用存储过程时,我无法在智能中看到存储的过程。我在做什么错误?
注:如果他们有返回值,我可以看到其他过程。在这种特殊情况下,没有任何返回值
我试图在我的Entity Framaework 4中使用存储过程。如何从实体框架调用没有返回数据的存储过程?
我已经创建了实体模型,并可以在Stored Procedure文件夹中的模型浏览器中看到存储的过程。
我通过功能导入添加了存储过程。我存储的proc没有返回类型。现在,当我试图在对象上下文(业务层)中调用存储过程时,我无法在智能中看到存储的过程。我在做什么错误?
注:如果他们有返回值,我可以看到其他过程。在这种特殊情况下,没有任何返回值
由于某种原因,POCO生成模板会忽略没有返回类型的函数导入。我真的不知道他们为什么这样做,但可以通过更改模板来修复它。我记得在我放弃整个EF-POCO之前,我也这样做了。你使用EF的POCO?要解决这个问题,你必须打开.tt模板文件。基本上我只是复制正常功能导入的循环,并稍微改变了它。我加入了
foreach (EdmFunction edmFunction in container.FunctionImports)
{
var parameters = FunctionImportParameter.Create(edmFunction.Parameters, code, ef);
string paramList = String.Join(", ", parameters.Select(p => p.FunctionParameterType + " " + p.FunctionParameterName).ToArray());
if (edmFunction.ReturnParameter != null)
{
continue;
}
#>
<#=Accessibility.ForMethod(edmFunction)#> void <#=code.Escape(edmFunction)#>(<#=paramList#>)
{
<#
foreach (var parameter in parameters)
{
if (!parameter.NeedsLocalVariable)
{
continue;
}
#>
ObjectParameter <#=parameter.LocalVariableName#>;
if (<#=parameter.IsNullableOfT ? parameter.FunctionParameterName + ".HasValue" : parameter.FunctionParameterName + " != null"#>)
{
<#=parameter.LocalVariableName#> = new ObjectParameter("<#=parameter.EsqlParameterName#>", <#=parameter.FunctionParameterName#>);
}
else
{
<#=parameter.LocalVariableName#> = new ObjectParameter("<#=parameter.EsqlParameterName#>", typeof(<#=parameter.RawClrTypeName#>));
}
<#
}
#>
base.ExecuteFunction("<#=edmFunction.Name#>"<#=code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()))#>);
}
<#
}
您可以找到相关的Q/A在这里:FunctionImport in entity framework 4 issue
您需要将程序映射到更新读取或删除操作,否则在映射它时没有意义。另一种方法是直接在上下文中执行它。