2014-01-20 35 views
10

我已经在Google上搜索了至少3个小时,但是我得到了与ADO.NET相关的所有问题的答案,但我使用的是实体框架工作室2012和MySQL。EntityCommand.CommandText值的格式必须是'ContainerName.FunctionImportName'

我想打电话给具有1个参数的存储过程和我做了什么:

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

    我的控制器函数体

    { db.SetRecipientsToRefferalPayments(新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”。

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

回答

17

这是一个非常奇怪的问题,花了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.NameedmFunction.FullName这是此功能的第二行并运行您的代码:)

我在EF5中遇到了此问题,希望Microsoft能够在未来的EF版本中解决此问题。

+1

此。这就在这里。我可以确认此修补程序在最新的版本中有效。的EF。为什么这还没有解决,但我不知道,但这只是使用EF 6.1.3保存我的代码。 –

+0

这对我来说非常合适!谢谢 –

+0

来自我的Bug问题 - 刚刚碰到这个从ObjectContext迁移到dbContext的巨大解决方案。在这个阶段我需要的最后一件事就是这样的古怪! –

5

我得到这个错误以及它原来是连接字符串。在我的情况下,我有两个具有相同实体模型名称的独立实体模型。

<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

更准确地说,它应该是程序集名称,而不是名称空间。请参阅[模型和映射文件位置](https://msdn.microsoft.com/en-us/library/vstudio/cc716756(v = vs.100).aspx) –

1

接受的答案并没有解决我的问题,但我发现了另一种方式,它解决了。

如果它没能解决你的问题,你可以尝试:

ExecuteFunction<MyClass>("YourDbContextName.YourProcedureName",parameters); 
相关问题