wcf服务中的自引用实体模型

时间:2013-08-06 06:37:03

标签: entity-framework silverlight wcf-data-services data-modeling

我创建了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请求已超出分配的超时时间”

1 个答案:

答案 0 :(得分: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();
}

希望这能帮到你!