我已经在Google上搜索了至少3个小时,但是我获得了与ADO.NET相关的所有问题的答案,但是我在Visual Studio 2012和mysql中使用了Entity Framework。

我想调用一个具有1个参数的存储过程,然后执行以下操作:


我从数据库中选择所有存储过程更新了模型。
然后我创建了函数导入
最后我编写了以下代码来调用该存储过程。

我的控制器功能主体

{
db.SetRecipientsToRefferalPayments(new ObjectParameter(“ referralId”,ReferralId));
}


我的自动生成的类(Model.Context.cs)

public virtual int SetRecipientsToRefferalPayments(ObjectParameter referralId)
        {
            return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("SetRecipientsToRefferalPayments", referralId);
        }


我得到以下错误:
EntityCommand.CommandText的值对于StoredProcedure命令无效。 EntityCommand.CommandText值的格式必须为“ ContainerName.FunctionImportName”。

有人指导我如何解决此问题?

最佳答案

我花了2-3个小时终于找到了解决方案,这是一个非常奇怪的问题。

解决该问题的步骤:

1)单击[模型] .Context.tt文件
2)使用XML编辑器或任何文本编辑器打开
3)在我的情况下,按CTRL + G到位置行288或277
4)或找到以下函数“ ExecuteFunction”

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);
}


5)将edmFunction.Name更改为edmFunction.FullName,这是该函数的第二行,然后运行您的代码:)

我在EF5中遇到了此问题,希望微软在将来的EF版本中解决此问题。

10-07 15:38