2

我创建了从实体框架工作模型返回产品实体集合的 WCF 服务。该产品具有自引用。我在 silverlight 应用程序中使用来自 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;
}

在运行时调用服务方法我得到超时错误

“HTTP 请求已经……超过了分配的超时时间”

4

1 回答 1

1

我认为问题在于将 IQueryable 作为返回类型与 WCF 服务结合使用。

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

在这种情况下,查询是通过调用ToList()方法执行的,因此 WCF 不必执行 IQueryable。

第二部分是在从上下文返回模型对象时,您可能会遇到序列化问题。因为 EF 通过继承将延迟加载功能注入到模型类中。

您应该在 service 方法中关闭当前上下文的延迟加载:

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

链接中对此进行了描述

接下来就是将模型类转换为 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();
}

希望这对你有帮助!

于 2013-08-06T07:31:51.527 回答