2010-12-06 108 views
2

我有我的資源庫對象的一個​​調用下面的方法WCF服務在數據庫中創建一個新的銷售對象實體框架和WCF(返回附加到上下文實體)

public static Sale New(Sale sale) 
{ 
    using (var ctx = new DBcontext()) 
    { 
     ctx.Sales.AddObject(sale); 
     ctx.SaveChanges(); 
     return sale; 
    } 
} 

的WCF方法調用這看起來像這樣

public Sale SaleNew(Sale sale) 
{ 
    return SaleRepository.New(sale); 
} 

當我把這種從客戶端應用程序,我得到以下錯誤

「基礎connectio n已關閉:連接意外關閉。「

如果我通過所有的代碼似乎運行良好,並將記錄插入到數據庫中。如果我調用SaveChanges後,以下行添加到我的倉庫方法,它工作正常

ctx.Detach(sale); 

是異常的發生,因爲我只要方法返回處置語境?在這種方式下使用實體環境是不好的做法,即立即處置它?我只是這樣做,因爲它的SOA和幾乎無狀態,所以我所有的存儲庫方法創建上下文返回值並處理上下文。任何傳入的內容都將添加到上下文中或重新添加。

回答

3

建議我在WCF中打開跟蹤並觀察發生了什麼。發生了代理異常。在這種情況下,由於我使用自己的POCO對象,我並不真的需要代理對象,因此我將DatabaseContext中的ContextOptions.ProxyCreationEnabled屬性設置爲false,現在它可以正常工作。

2

1)正在使用實體上下文這種不好的做法,即立即處置它?

不,這就是我的做法 - 我相信這是做到這一點的正確方法。但創建上下文可能是昂貴的和EF我們堅持與沒有理想的方式重用上下文。

2)ctx.Detach(sale);

這個據我知道不應該要求你在做什麼,儘管我有問題的負載與連接,當我重複使用相同的實體分離。 這應該只在需要重新連接到上下文時才需要。您使用的是延遲加載

+0

在這種情況下,我沒有使用延遲加載,但我可能會在將來的其他地方使用它。 – Gavin 2010-12-06 12:24:21