【问题标题】:entity framework 4 POCO's stored procedure error - "The FunctionImport could not be found in the container"实体框架 4 POCO 的存储过程错误 - “The FunctionImport could not be found in the container”
【发布时间】:2011-02-03 23:23:31
【问题描述】:

具有由 T4 模板生成的 POCO 实体的实体框架。添加了命名为“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 ...”

我做错了什么?

【问题讨论】:

    标签: wcf stored-procedures frameworks entity


    【解决方案1】:

    您需要使用容器名称来限定函数导入。

    例如改变这个:

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

    到这里:

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

    实体容器名称可在您的 EDMX 上找到 - 右键单击​​任意位置并执行“属性”。

    【讨论】:

      【解决方案2】:

      我在使用 EF 4.1 时遇到了类似的问题......并且发现当代码在发布模式下运行时我会遇到这个问题。在调试模式下,它工作正常。

      【讨论】:

      • 我尝试按照这里的建议添加容器名称,但这并没有解决我的问题。
      猜你喜欢
      • 1970-01-01
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2016-04-28
      相关资源
      最近更新 更多