Значение 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="Data Source=...."" 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="Data Source=...."" 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="Data Source=...."" providerName="System.Data.EntityClient" />
Ответ 3
Принятый ответ не решил мою проблему, но я нашел другой способ и был решен.
Если он не смог решить вашу проблему, вы можете попробовать следующее:
ExecuteFunction<MyClass>("YourDbContextName.YourProcedureName",parameters);