Операция CRUD с ошибкой edmx и objectdatasource Idisposable - PullRequest
0 голосов
/ 07 марта 2011

У меня есть 3 уровня приложений.

В слое Persistance просто перетащите файл Entities.edmx для перетаскивания.

В слое Presentation:

<asp:ObjectDataSource ID="ObjectDataSource_Tva" runat="server" 
        DeleteMethod="del_Tva" InsertMethod="Inst_Tva" 
        SelectMethod="Get_All_Tva" 
        TypeName="FaExped_BackEnd_WebApp_Business.Le_T.LeTVA_Entite_BL" 
        UpdateMethod="Updt_Tva">
    <DeleteParameters>
        <asp:Parameter Name="Id" Type="Int32" />
    </DeleteParameters>
    <InsertParameters>
        <asp:Parameter Name="Id" Type="Int32" />
        <asp:Parameter Name="Libelle" Type="String" />
    </InsertParameters>
    <UpdateParameters>
        <asp:Parameter Name="Id" Type="Int32" />
        <asp:Parameter Name="Libelle" Type="String" />
    </UpdateParameters>
</asp:ObjectDataSource>

И представление сетки, которое подключается к этому источнику данных объекта.

В моем слое логики бизнеса, когда я использую его следующим образом:

public IEnumerable<T_TVA> Get_All_Tva()
{
    FaExpedEntities oEntite_T = new FaExpedEntities();
    var query = from o in oEntite_T.T_TVA select o;
    IEnumerable<T_TVA> LesTva = query;
    return LesTva;       
}

Это работает, но когда я использую так:

public IEnumerable<T_TVA> Get_All_Tva()
{
    using (FaExpedEntities oEntite_T = new FaExpedEntities())
    {
        var query = from o in oEntite_T.T_TVA select o;
        IEnumerable<T_TVA> LesTva = query;
        return LesTva;
    }         
}

Это не работает. В нем говорится, что экземпляр ObjectContext был удален и не может использоваться для операций, требующих подключения.

Почему?

Какая разница в том, что при использовании синтаксиса "using" происходит сбой, а при работе без using?

Какой подход лучше, с или без "using"?

1 Ответ

1 голос
/ 07 марта 2011

Я подозреваю, что ваша ошибка с кодом, содержащим оператор using, связана с отложенным выполнением . По сути это означает, что соединение с базой данных было закрыто до , когда выполняется запрос LINQ для получения результатов.

Один из распространенных способов обойти это - принудительно выполнить запрос LINQ, используя незамедлительный оператор, такой как ToList().

Существует множество хороших статей на MSDN, касающихся отложенного выполнения, которые применяются ко всем типам LINQ, а не только к использованию LINQ с Entity Framework.

...