4

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

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

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

解决方案,如错误消息中的指示很清楚,我只需要添加 ContainerName。在 context.cs 文件中的 FunctionImportName(在我的例子中为 GetStockItem)之前。

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

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

4

2 回答 2

8

我刚刚使用 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);
}

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

于 2013-10-01T22:40:39.567 回答
2

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

于 2013-06-28T17:28:51.137 回答