使用edmx和objectdatasource错误Idisposable操作CRUD

时间:2011-03-07 10:33:43

标签: c# objectdatasource edmx

我有3层应用程序。

在Persistance图层中,只是拖放'n'的Entities.edmx文件。

在表现层:

<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>

连接到此objectdatasource的gridview。

在我的业务逻辑层中,当我像这样使用它时:

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 个答案:

答案 0 :(得分:1)

我怀疑您使用using语句的代码出错是由于延迟执行。本质上,这意味着在执行LINQ查询以检索结果之前已关闭数据库连接

一个常见的解决方法是“强制”使用像ToList()这样的非延迟运算符立即执行LINQ查询。

MSDN上有很多关于延迟执行的good articles,它适用于所有类型的LINQ,而不仅仅是使用带有实体框架的LINQ。