EntityCommand.CommandText值的格式必须为'ContainerName.FunctionImportName'

时间:2014-01-20 18:05:28

标签: entity-framework stored-procedures

我至少在谷歌上搜索了3个小时,但我得到了与ADO.NET相关的这个问题的所有答案,但我在Visual Studio 2012和mysql中使用了实体框架。

我想调用一个包含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'。

任何人都指导我如何解决这个问题?

3 个答案:

答案 0 :(得分:19)

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

解决该问题的步骤:

1)单击[Model] .Context.tt文件 2)使用XML Editor或任何文本编辑器打开 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版本中解决这个问题。

答案 1 :(得分:6)

我也遇到了这个错误,结果证明是连接字符串。在我的情况下,我有两个独立的实体模型,它们具有相同的实体模型名称。

<connectionStrings>
<add name="EntityModelNameEntities" connectionString="metadata=res://My.Namespace.FirstOne/EntityModelName.csdl|res://My.Namespace.FirstOne/EntityModelName.ssdl|res://My.Namespace.FirstOne/EntityModelName.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=....&quot;" providerName="System.Data.EntityClient" />
<add name="OtherModelEntities" connectionString="metadata=res://*/EntityModelName.csdl|res://*/EntityModelName.ssdl|res://*/EntityModelName.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=....&quot;" providerName="System.Data.EntityClient" />
</connectionStrings>

当OtherModelEntities试图找到模型资源时,由于使用了*通配符匹配,它最终匹配My.Namespace.FirstOne中的模型资源。为了纠正这个问题,我更新了OtherModelEntities连接字符串以包含如下命名空间:

<add name="OtherModelEntities" connectionString="metadata=res://My.Namespace.SecondOne/EntityModelName.csdl|res://My.Namespace.SecondOne/EntityModelName.ssdl|res://My.Namespace.SecondOne/EntityModelName.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=....&quot;" providerName="System.Data.EntityClient" />

答案 2 :(得分:1)

接受的答案并没有解决我的问题,但我找到了另一种方式并且它已经解决了。

如果它无法解决您的问题,您可以尝试:

ExecuteFunction<MyClass>("YourDbContextName.YourProcedureName",parameters);