2

我創建了WCF服務,該服務從實體框架工作模型返回一個產品實體集合。該產品具有自引用。我從Silverlight應用程序中的WCF服務使用數據。 我使用異步方法。產品實體建模這種形式:wcf服務中的自我參考實體模型

Public partial class Product 
{ 

    Public Product(){ 
     this.product_11=new HashSet<Product>; 
    } 

    [DataMember] 
    public int Id{get; set;} 
    [DataMember] 
    public Nullable<int> subPro{get; set;} 
    [DataMember] 
    Public virtual Icollection<Product> product_11{get; set;} 
    [DataMember] 
    Public virtual Product product_12{get; set;} 
} 

,我使用,在服務梅索德

productEntity ef=new productEntity(); 

[OperationContract] 
Public IEnumerable<Product> Getproduct() 
{ 
    return ef.Product; 
} 
在運行時whene呼叫服務梅索德我得到超時錯誤

「的HTTP請求有...超過了分配的超時時間「

回答

1

我認爲問題在於使用IQueryable作爲返回類型與WCF服務的組合。

[OperationContract] 
Public IEnumerable<Product> Getproduct() 
{ 
    return ef.Product.ToList(); 
} 

在這種情況下的查詢與ToList()方法的調用執行,因此,WCF具有不執行的IQueryable。

第二部分是,當從上下文返回模型的對象時,可能會遇到序列化問題。因爲EF通過繼承將延遲加載功能注入到模型類中。

您應關閉延遲加載的服務方法您的當前環境:

context.ContextOptions.LazyLoadingEnabled = false; 
context.ContextOptions.ProxyCreationEnabled = false; 

這將在本link

描述接下來的事情是,序列化,轉化模型類到XML消息遇到了循環引用的麻煩。下面是這可能會導致一個問題的例子:

public class A 
{ 
    public string PropA { get; set; } 
    public virtual B PropB { get; set; } 
} 

public class B 
{ 
    public string PropC { get; set; } 
    public virtual A PropD { get; set; } 
} 

您可以通過使用CyclicReferencesAware屬性爲OperationContract方法避免這種情況:

[OperationContract] 
[CyclicReferencesAware(true)] 
Public IEnumerable<Product> Getproduct() 
{ 
    return ef.Product.ToList(); 
} 

希望這可以幫助你!

+0

對不起,它不工作。我得到相同的錯誤 –

+0

您可以嘗試返回新創建的產品(不帶EF!)列表以檢查問題是否出現在答案的序列化中。 – boindiil

+0

我創建了一個沒有EF的產品類型和相同類型的屬性,並通過WCF將產品列表發送給客戶端。但是在EF中與自我關係相似的類型,不能被客戶感知; –