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 インスタンスが破棄されたため、接続が必要な操作には使用できなくなりました」というエラーが表示されます。

データベース層では、関連するエンティティは正しくマップされますが、winform コードでは、接続が失われたようにこの例外が発生します。

これはストアド プロシージャで発生します (db.Bien_Servicio.Include("Bs_tipo").ToList(); を使用する場合は問題ありません)。結果を .ToList() に変換しても。私のエラーは何ですか?

前もって感謝します。

4

2 に答える 2

0

これは遅延読み込みの問題です。リストはロードしますBien_Servicioが、関連する参照はロードしません。したがって、メソッドの消費者がコンテキストListarBien_servicioにアクセスしようとすると、言及した例外が発生します。Bien_Servicio.Bs_Tipo

では、関連するエンティティを読み込む方法は? ストアド プロシージャは構成可能ではないため、ストアド プロシージャへの呼び出しでそれらをロードすることはできません (つまり、ajoinを sql に変換する方法がありません)。したがって、結合が含まれ、linqで結合を使用できないためObjectResult、サポートする方法はありません。Include

コンテキストの範囲内LoadBs_Tipo参照を手動で行う必要があります。usingまたは、ストアド プロシージャがBS_Id値のみを返すようにし、IdSelectから完全なレコードまでdb.Bien_Servicioを使用する必要がありますInclude

于 2012-09-03T13:39:34.783 に答える
0

Loadを使用してこれを解決しました:

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 に答える