EF5需要更新ContainerName.FunctionImportName以便在更新模型时访问存储过程,任何有趣的解决方案?

Yan*_* Li 4 stored-procedures entity-framework-5

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

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

"EntityCommand.CommandText的值对StoredProcedure命令无效.EntityCommand.CommandText值的格式必须为'ContainerName.FunctionImportName'."

根据错误消息中的说明,解决方案很明确,我只需要添加ContainerName.在context.cs文件中的FunctionImportName(在我的例子中为GetStockItem)之前.

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

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

Tec*_*ble 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);
}
Run Code Online (Sandbox Code Playgroud)

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