0

我有以下存储过程:

ALTER PROCEDURE [dbo].[SP_BuscarBien_servicio]
@campo varchar(50),
@numPags int,
@numRegs int
AS
BEGIN
    SELECT TOP (@numRegs) 
        [Project1].[BS_Id] AS [BS_Id], 
        [Project1].[BS_Descripcion] AS [BS_Descripcion], 
        [Project1].[UNM_Id] AS [UNM_Id], 
        [Project1].[BS_CostoPromedio] AS [BS_CostoPromedio], 
        [Project1].[BSTIP_Id] AS [BSTIP_Id], 
        [Project1].[UNM_Id1] AS [UNM_Id1], 
        [Project1].[UNM_Descripcion] AS [UNM_Descripcion], 
        [Project1].[BSTIP_Id1] AS [BSTIP_Id1], 
        [Project1].[BSTIP_Descripcion] AS [BSTIP_Descripcion]
        FROM ( 
            SELECT [Project1].[BS_Id] AS [BS_Id], 
                   [Project1].[BS_Descripcion] AS [BS_Descripcion], 
                   [Project1].[UNM_Id] AS [UNM_Id], 
                   [Project1].[BS_CostoPromedio] AS [BS_CostoPromedio], 
                   [Project1].[BSTIP_Id] AS [BSTIP_Id], 
                   [Project1].[UNM_Id1] AS [UNM_Id1], 
                   [Project1].[UNM_Descripcion] AS [UNM_Descripcion], 
                   [Project1].[BSTIP_Id1] AS [BSTIP_Id1], 
                   [Project1].[BSTIP_Descripcion] AS [BSTIP_Descripcion], 
                   row_number() OVER (ORDER BY [Project1].[BS_Descripcion] ASC) AS [row_number]
            FROM ( SELECT 
                    [Extent1].[BS_Id] AS [BS_Id], 
                    [Extent1].[BS_Descripcion] AS [BS_Descripcion], 
                    [Extent1].[UNM_Id] AS [UNM_Id], 
                    [Extent1].[BS_CostoPromedio] AS [BS_CostoPromedio], 
                    [Extent1].[BSTIP_Id] AS [BSTIP_Id], 
                    [Extent2].[UNM_Id] AS [UNM_Id1], 
                    [Extent2].[UNM_Descripcion] AS [UNM_Descripcion], 
                    [Extent3].[BSTIP_Id] AS [BSTIP_Id1], 
                    [Extent3].[BSTIP_Descripcion] AS [BSTIP_Descripcion]
                    FROM   [dbo].[Bien_servicio] AS [Extent1]
                    INNER JOIN [dbo].[Unidad_Medida] AS [Extent2] ON [Extent1].[UNM_Id] = [Extent2].[UNM_Id]
                    LEFT OUTER JOIN [dbo].[Bs_tipo] AS [Extent3] ON [Extent1].[BSTIP_Id] = [Extent3].[BSTIP_Id]
                    WHERE [Extent1].[BS_Descripcion] like '%'+ @campo + '%'
                    or [Extent2].[UNM_Descripcion] like '%'+ @campo + '%'
                    or [Extent1].[BS_CostoPromedio] like '%'+ @campo + '%'
                    or [Extent3].[BSTIP_Descripcion] like '%'+ @campo + '%'
                )  AS [Project1]
        )  AS [Project1]
        WHERE [Project1].[row_number] > (@numPags - 1)*@numRegs
        ORDER BY [Project1].[BS_Descripcion] ASC
END

在此函数中导入:

public static List<Bien_servicio> ListarBien_servicio(int numPags, int numRegs, String campo = "")
{
    try
    {
        using (SampleDBEntities db = new SampleDBEntities())
        {
           return db.BuscarBien_servicio(campo, numPags, numRegs).ToList();
        }
    }
    catch (Exception)
    {
        throw;
    }
 }

使用以下关系

bs_tipo --< Bien_servicio >--- Unidad_Medida

当我尝试获取相关实体 (Bien_Servicio.Bs_Tipo) 时,我收到错误消息:“ObjectContext 实例已被释放,不能再用于需要连接的操作”

在 db 层,相关实体被正确映射,但在 winform 代码中,我得到了这个异常,就像我失去了连接一样。

这发生在存储过程中(如果我使用 db.Bien_Servicio.Include("Bs_tipo").ToList(); 我没有问题)。即使我将结果转换为 .ToList()。我的错误是什么?

提前致谢。

4

2 回答 2

0

这是一个延迟加载问题。您确实加载了Bien_Servicio列表,但没有加载相关参考。因此,当您的方法的使用者ListarBien_servicio尝试访问Bien_Servicio.Bs_Tipo上下文时,就会出现您提到的异常。

那么如何加载相关实体呢?您不能在对存储过程的调用中加载它们,因为存储过程不可组合(这意味着:无法将 ajoin转换为 sql)。所以没有办法ObjectResult支持Include,因为它涉及到加入,你也不能在 linq 中使用加入。

您必须Load在上下文范围内Bs_Tipo手动引用引用using。或者您应该只让您的存储过程返回BS_Id值,并将 Id 用于(使用)Select的完整记录。db.Bien_ServicioInclude

于 2012-09-03T13:39:34.783 回答
0

我使用加载解决了这个问题:

var x = (from b in db.BuscarBien_servicio(campo, numPags, numRegs)
        select b).ToList();
foreach (Bien_servicio b in x)
{
     b.Unidad_MedidaReference.Load();
     b.Bs_tipoReference.Load();
}
return x;

代替

return db.BuscarBien_servicio(campo, numPags, numRegs).ToList();
于 2012-09-04T01:02:12.217 回答