Имена параметров хранимых процедур и Entity Framework - PullRequest
1 голос
/ 29 апреля 2011

Я сгенерировал модель Entity Framework из базы данных SQL Server 2005 и начал импортировать хранимые процедуры.Пока все хорошо, но одна из хранимых процедур выдает исключение, когда я пытаюсь запустить его:

Процедура или функция 'csp_getCoworker' ожидает параметр '@@ firstname', который не был предоставлен.

Вот подпись для хранимой процедуры:

ALTER PROCEDURE [dbo].[csp_getCoworker](
@@firstname nvarchar(32),
@@lastname nvarchar(32),
@@businessarea nvarchar(512),
@@location nvarchar(512)
)

А вот код, сгенерированный Entity Framework

ObjectParameter p_firstnameParameter;
if (p_firstname != null)
{
    p_firstnameParameter = new ObjectParameter("p_firstname", p_firstname);
}
    else
{
     p_firstnameParameter = new ObjectParameter("p_firstname", typeof(global::System.String));
}
[...]
return base.ExecuteFunction<csp_getCoworker_Result2>("csp_getCoworker", p_firstnameParameter, p_lastnameParameter, p_businessareaParameter, p_locationParameter);

Это двойной @ -символы в имени параметра, которые все портят?

1 Ответ

2 голосов
/ 01 мая 2011

Я только что проверил это, потому что это очень необычный сценарий.

Хранимая процедура следует очень странному соглашению об именах, потому что @@ не должен использоваться.По умолчанию он используется некоторыми системными переменными SQL-сервера и не должен использоваться ни для чего другого.Использование @x в качестве параметра хранимой процедуры определяет параметр x, но использование @@x определит параметр @x - @ является частью имени параметра!

Это очень большая проблема в C #, потому что @это управляющий символ, используемый для определения имен переменных, аналогичных зарезервированным ключевым словам.Например:

string @string = "abc";

определяет переменную с именем string.Имя переменной не может начинаться с @.

Платформа сущностей справляется с этим, заменяя все @ на _ и добавляя префикс имени параметра к p непосредственно в SSDL.Причина заключается в том, что импорт функций, созданный из сопоставленной хранимой процедуры SSDL, должен иметь параметры с тем же именем, что и у процедуры, но в то же время @ не допускается начальный символ.Если вы попытаетесь изменить EDMX вручную, он не сможет выполнить свою собственную проверку XSD, потому что @ не допускается начальный символ для идентификаторов, определенных в CSDL.

Даже это, вероятно, можно рассматривать как ошибку, скорее, отсутствует возможность изменитьимя параметра в CSDL.На данный момент это сделано специально, и единственный способ - исправить имена параметров в хранимой процедуре SQL.

...