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)之前.
我的问题是,每次从数据库更新模型时,如何避免发生这种情况?偶尔做这个手动的东西很烦人,而且很容易忘记这样做然后引起用户的抱怨.
希望有人能用迷人的解决方案来启发我!干杯!
我刚刚使用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,并在保存时,将使用完全限定名称重新生成函数导入代码.