2011-05-13 82 views
1

我通过WCF服务获取我的应用程序的数据。而在服务器端,服务使用EF4.1作为数据访问。 服务方法看起来有点像这样:WCF/EF 4.1的问题懒惰加载

public List<JobOffer> GetAllJobOffers() 
{ 
    var allJobOffers = _jobOffersRepository.GetAll().ToList(); 
    return allJobOffers; 
} 

,仓库在完成这样

public override IQueryable<JobOffer>GetAll() 
{ 
    return _context.JobOffers.Include(c => c.Company); 
} 

我得到这个奇怪的错误:

An error occurred while receiving the HTTP response to http://localhost:8080/JobsService/ws . This could be due to the service endpoint binding not using the HTTP protocol. This could also be due to an HTTP request context being aborted by the server (possibly due to the service shutting down). See server logs for more details.

在调试模式后击中F5它开始永久循环。

在我的情况下,它应该在服务器端延迟加载一些问题。因为当我调用服务来返回具有简单结构的对象时,它就像一个冠军。什么可能会搞砸了?用EF快速加载对象的最佳做法是什么?

回答

5

当通过WCF使用EF时,应该关闭延迟加载,因为序列化会触发延迟加载每个导航属性。另一个问题是默认情况下不可序列化的cyclic references。如果您的Company也具有其导航属性Jobs它将循环引用。

+0

所以你说没有办法通过电线发送整个对象树? – 2011-05-13 19:15:09

+0

有一种方法,但您必须帮助WCF序列化实体。这里有你所有的选择:http://stackoverflow.com/questions/5762135/ef4-cause-circular-reference-in-web-service/5763627#5763627 – 2011-05-13 19:54:18

+0

非常感谢。 EF帮助我解决了大部分问题! – 2011-05-13 20:15:35

0

我认为你的问题更像是与循环关系有关。这一切都发生在序列化进入范围之内时。可以说你有一个物业地址被标记为懒惰的实体人。关系的另一方地址实体具有Person实体的导航属性。随着序列化的发生,它会遍历人体实体的每个属性,并在访问地址导航属性时开始加载它。现在它开始序列化Address实体,并且在它访问Person导航属性时,它会返回到该属性并开始序列化它,并且在循环序列化开始并且无法完成时创建情况。为了克服这个问题,你不必懒惰加载,但所有你必须做的是用[DataContract(IsReference = true)]来装饰你的datacontract(在这个例子中是Person和Addresse),并且一切都像魅力一样。