WCF / EF 4.1延迟加载问题

时间:2011-05-13 18:56:52

标签: wcf web-services lazy-loading entity-framework-4.1

我通过WCF服务获取应用程序的数据。在服务器端,该服务使用EF4.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急切加载对象的最佳做法是什么?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

我认为你的问题更像是与循环关系有关。当序列化进入范围时,这一切都会发生。假设你有一个实体人,它有一个标记为懒惰的属性地址。在关系的另一端,地址实体具有Person实体的导航属性。当序列化发生时,它遍历person实体的每个属性,并且当它访问Addresses导航属性时开始加载它。现在它开始序列化地址实体,并且当它访问Person导航属性时,它会返回到该属性并开始序列化它,并且当循环序列化开始并且无法完成时会产生这种情况。为了克服这个问题,你不必转向延迟加载,但你要做的就是用[DataContract(IsReference = true)]装饰你的数据(在本例中是Person和Addresse),一切都像魅力一样。 / p>

答案 2 :(得分:0)

我知道这是一个老问题,但根据您在问题中的经验,我认为如果您查看我最近发布的一篇文章可能会有所帮助 http://sanderstechnology.com/2013/more-with-the-entity-framework-v6-rc1/12423/

我将介绍如何发送通过WCF反序列化的半复杂EF对象图,并处理延迟加载,代理生成和循环引用问题。可能值得一看。