2011-03-07 32 views
0

我有3層應用程序。使用edmx和objectdatasource錯誤操作CRUD Idisposable

在Persistance層中,只是將'n'拖放到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> 

和連接到這個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

我懷疑你的錯誤與using聲明的代碼是由於推遲執行。實質上,這意味着數據庫連接已經在之前關閉執行LINQ查詢以檢索結果。

一個常見的工作是'強制'LINQ查詢立即執行使用非延遲運算符如ToList()

MSDN上有很多關於延遲執行的goodarticles,這些延遲執行適用於所有類型的LINQ,而不僅僅是將LINQ與實體框架結合使用。