2014-01-20 38 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); 
相關問題