Entity Framework 4 Ошибка хранимой процедуры POCO - «Не удалось найти FunctionImport в контейнере» - PullRequest
3 голосов
/ 04 февраля 2011

Entity Framework с POCO-сущностями, созданными по шаблону T4. Добавлена ​​функция импорта с именем «procFindNumber», указанная сложная коллекция с именем «NumberResult».

Вот что сгенерировано в файле Context.cs:

public ObjectResult<NumberResult> procFindNumber(string lookupvalue)
{
   ObjectParameter lookupvalueParameter;

   if (lookupvalue != null)
   {
      lookupvalueParameter = new ObjectParameter("lookupvalue", lookupvalue);
   }
   else
   {
       lookupvalueParameter = new ObjectParameter("lookupvalue", typeof(string));
   }
   return base.ExecuteFunction<NumberResult>("procFindNumber", lookupvalueParameter);
}

Вот хранимая процедура:

ALTER PROCEDURE [dbo].[procFindNumber] 
@lookupvalue varchar(255)   
AS
BEGIN
SET NOCOUNT ON;    
DECLARE @sql nvarchar(MAX); 

IF @lookupvalue IS NOT NULL AND @lookupvalue <> ''
    BEGIN                   
        SELECT @sql = 'SELECT dbo.HBM_CLIENT.CLIENT_CODE, dbo.HBM_MATTER.MATTER_NAME, dbo.HBM_MATTER.CLIENT_MAT_NAME 
                FROM dbo.HBM_MATTER INNER JOIN dbo.HBM_CLIENT ON dbo.HBM_MATTER.CLIENT_CODE = dbo.HBM_CLIENT.CLIENT_CODE 
                LEFT OUTER JOIN dbo.HBL_CLNT_CAT ON dbo.HBM_CLIENT.CLNT_CAT_CODE = dbo.HBL_CLNT_CAT.CLNT_CAT_CODE 
                LEFT OUTER JOIN dbo.HBL_CLNT_TYPE ON dbo.HBM_CLIENT.CLNT_TYPE_CODE = dbo.HBL_CLNT_TYPE.CLNT_TYPE_CODE 
                WHERE (LTRIM(RTRIM(dbo.HBM_MATTER.CLIENT_CODE)) <> '''')'
        SELECT @sql = @sql + ' AND (dbo.HBM_MATTER.MATTER_NAME like ''%' + @lookupvalue + '%'')'
        SELECT @sql = @sql + ' OR (dbo.HBM_MATTER.CLIENT_MAT_NAME like ''%' + @lookupvalue + '%'')'
        SELECT @sql = @sql + ' ORDER BY dbo.HBM_MATTER.MATTER_NAME'
        -- Execute the SQL query
        EXEC sp_executesql @sql
    END 
END

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

[WebGet(UriTemplate = "number/{value}/?format={format}")]        
public IEnumerable<NumberResult> GetNumber(string value, string format)
{
   if (string.Equals("json", format, StringComparison.OrdinalIgnoreCase))
   {
       WebOperationContext.Current.OutgoingResponse.Format = WebMessageFormat.Json;
   }

   using (var ctx = new MyEntities())
   {                
       ctx.ContextOptions.ProxyCreationEnabled = false;
       var results = ctx.procFindNumber(value);
       return results.ToList();
   }
}

Сообщение об ошибке гласит: «FunctionImport ... не удалось найти в контейнере ...»

Что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011

Вам необходимо присвоить импорту функции имя контейнера.

Например, измените это:

return base.ExecuteFunction<NumberResult>("procFindNumber", lookupvalueParameter);

к этому:

return base.ExecuteFunction<NumberResult>("EntityContainerName.procFindNumber", lookupvalueParameter);

Имя контейнера сущностей находится на вашем EDMX - щелкните правой кнопкой мыши в любом месте и выполните «Свойства».

1 голос
/ 12 декабря 2011

У меня была похожая проблема с EF 4.1 ... и я обнаружил, что могу получить эту проблему, когда код работает в режиме выпуска.В режиме отладки работает нормально.

...