Stored procedures EF5需要更新ContainerName.FunctionImportName,以便在更新模型时访问存储过程,有什么解决方案吗?

Stored procedures EF5需要更新ContainerName.FunctionImportName,以便在更新模型时访问存储过程,有什么解决方案吗?,stored-procedures,entity-framework-5,Stored Procedures,Entity Framework 5,我是实体框架新手,如果我的问题太简单,请原谅 目前我正在使用EF5构建我的项目,我的项目中有一个函数Import“GetStockItem”,它调用存储过程并从SP返回数据。每次我从模型图中“从数据库更新模型”时,更新向导都会毫无问题地反映数据库的更改,但GetStockItem停止工作。调用GetStockItem时的错误消息为: “EntityCommand.CommandText的值对于StoredProcedure命令无效。EntityCommand.CommandText值的格式必须为

我是实体框架新手,如果我的问题太简单,请原谅

目前我正在使用EF5构建我的项目,我的项目中有一个函数Import“GetStockItem”,它调用存储过程并从SP返回数据。每次我从模型图中“从数据库更新模型”时,更新向导都会毫无问题地反映数据库的更改,但GetStockItem停止工作。调用GetStockItem时的错误消息为:

“EntityCommand.CommandText的值对于StoredProcedure命令无效。EntityCommand.CommandText值的格式必须为‘ContainerName.FunctionImportName’。”

按照错误消息中的说明,解决方案很清楚,我只需要添加ContainerName。在context.cs文件中的函数importName(在我的例子中是GetStockItem)之前

我的问题是,当我每次从数据库更新模型时,如何避免这种情况发生?时不时地做这种手工操作很烦人,而且很容易忘记做这件事,然后引起用户的抱怨


希望有人能用迷人的解决方案来启发我!干杯

我遇到了类似的问题,我建议根本不要更改context.cs文件;仅确保EF生成的app.config文件中的连接字符串在调用项目中是相同的,尤其是连接字符串中的元数据非常重要,必须正确。如果有帮助,请将此答案标记为已接受,否则请将重现此错误的步骤发送给我。

我刚刚使用EF5/DbContext遇到此问题。我找到的解决方案是编辑生成DbContext的T4模板([Model].Context.tt)

在此文件中,找到生成ExecuteFunction调用的说明。对我来说,这是从288行开始的:

public string ExecuteFunction(EdmFunction edmFunction, string modelNamespace, bool includeMergeOption)
{
    var parameters = _typeMapper.GetParameters(edmFunction);
    var returnType = _typeMapper.GetReturnType(edmFunction);

    var callParams = _code.StringBefore(", ", String.Join(", ", parameters.Select(p => p.ExecuteParameterName).ToArray()));
    if (includeMergeOption)
    {
        callParams = ", mergeOption" + callParams;
    }

    return string.Format(
        CultureInfo.InvariantCulture,
        "return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction{0}(\"{1}\"{2});",
        returnType == null ? "" : "<" + _typeMapper.GetTypeName(returnType, modelNamespace) + ">",
        edmFunction.Name,
        callParams);
}
publicstringexecutefunction(EdmFunction-EdmFunction,stringmodelnespace,bool includeMergeOption)
{
var参数=_typeMapper.GetParameters(函数);
var returnType=_typeMapper.GetReturnType(函数);
var callParams=_code.StringBefore(“,”,String.Join(“,”,parameters.Select(p=>p.ExecuteParameterName.ToArray());
if(includemerge选项)
{
callParams=“,mergeOption”+callParams;
}
返回字符串格式(
CultureInfo.InvariantCulture,
返回((IObjectContextAdapter)this.ObjectContext.ExecuteFunction{0}(\“{1}\”{2});”,
returnType==null?”:“”,
函数名,
调用参数);
}

修改返回行,使edmFunction.Name替换为edmFunction.FullName,保存后,将使用完全限定的名称重新生成函数导入代码。

谢谢。这对我来说很有效,但我不太乐意更改生成的文件。