已禁用延迟加载EF无法正常工作?

时间:2011-09-12 15:42:27

标签: c# wcf entity-framework

我正在尝试通过WCF服务返回多个elementes列表,我想控制列表中加载的每个对象,以避免序列化和返回结果时出现堆栈溢出异常。

我使用LINQ to Entities填充此列表,并且我已禁用EF模型的延迟加载...但是当我尝试它时,会填充许多引用,并在尝试返回List时抛出异常。

这是一个例子:

public class DelegacionesDAO : IDelegacionesDAO
    {
        Model.Entities entities = new Model.Entities();

        public DelegacionesDAO()
        {
            entities.ContextOptions.ProxyCreationEnabled = false;
            entities.ContextOptions.LazyLoadingEnabled = false;
        }

    public List<Model.Things> GetDelegaciones()
            {
                IQueryable<Model.Things> thingsList= from things in entities.Things
                                                     select things;

                return thingsList.ToList<Model.Things>();
            }
}

这个表“事物”被其他像“人物”(有东西)引用,这就是问题,当我试图返回它时,每个“事物”都有一个“人物”及其他人的列表。

我错过了什么吗?

提前致谢!

编辑: 添加了一些代码。现在它正在工作......我认为当你试图“观察”它时,它会加载每个导航属性,即使它没有加载:-S

现在我只是怀疑我是否通过在构造函数中创建实体实例以通过WCF使用它来做得很好。

2 个答案:

答案 0 :(得分:2)

在使用WCF时,不要使用长期上下文(在您的情况下为字段“实体):

  • 它不是线程安全的(尤其是在其他线程正在准备数据时从不同的线程调用SaveChanges)
  • 上下文收集并关联您正在加载的每个实体(只要您没有明确使用MergeOption.NoTracking)

答案 1 :(得分:1)

如果您关闭了延迟加载,则必须告知EF加载引用。

试试这个:

var thingsList= (from things in entities.Things
                select things) as ObjectQuery<Model.Things>;
thingsList = thingsList.Include("Persons"); //name of navigation property

return thingsList.ToList<Model.Things>();