Значение EntityCommand.CommandText должно иметь форму "ContainerName.FunctionImportName"

Я искал в Google по крайней мере 3 часа, но я получаю ответы на все вопросы, относящиеся к ADO.NET, но я использую инфраструктуру Entity с visual studio 2012 и mysql.

Я хочу вызвать хранимую процедуру с 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".

кто-нибудь подскажет мне, как я могу решить эту проблему?

Ответ 1

Это была очень странная проблема, потратив 2-3 часа, наконец, я понял решение.

Шаги по устранению этой проблемы:

1) Нажмите [Model].Context.tt File 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, надеясь, что Microsoft исправит эту проблему в будущих версиях EF.

Ответ 2

Я тоже получал эту ошибку, и она оказалась строкой соединения. В моей ситуации я имел две отдельные модели сущностей, которые имели одно и то же имя модели сущности.

<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" />

Ответ 3

Принятый ответ не решил мою проблему, но я нашел другой способ и был решен.

Если он не смог решить вашу проблему, вы можете попробовать следующее:

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