我花了两天的时间来反对这个问题,我似乎无法破解它(问题是).相同的代码工作正常,直到我添加数据库关系,我已经读了很多关于延迟加载.
我有两个数据库表,它们之间有1:1的关系. PromoCode
表跟踪代码,并有一个名为的PK列id
. CustomerPromo
table有一个PromoId
链接到PromoCode
表的列id
.这两个表没有其他关系.我在SQL Server Management Studio中生成了所有这些,然后从数据库生成模型.
为了使问题稍微复杂一点,我在WCF数据服务中这样做,但我不认为这应该有所作为(它在添加数据库关系之前有效).启用日志记录后,我总是在日志文件中获得带有文本的异常:
Dispose后访问DataContext.
我的函数当前返回表中的所有条目:
using (MsSqlDataContext db = new MsSqlDataContext()) { // This causes issues with lazy-loading return db.PromoCodes.ToArray(); }
我已经阅读了很多文章/页面/答案,他们都说要使用这种.Include()
方法.但这对我不起作用:
return db.PromoCodes.Include(x => x.CustomerPromos).ToArray();
我也尝试了"魔术字符串"版本:
return db.PromoCodes.Include("CustomerPromos").ToArray();
我设法开始工作的唯一代码是:
PromoCode[] toReturn = db.PromoCodes.ToArray(); foreach (var p in toReturn) p.CustomerPromos.Load(); return toReturn;
我已经尝试.Where()
为查询添加了一个条件,我已经尝试过了.Select()
,我尝试.Include()
过后移动.Where()
(这个答案说要做到最后,但我认为这仅仅是由于嵌套查询).我已经读过有关.Include()
静默失败的场景,毕竟我不会更接近.
我错过了什么?语法问题?逻辑问题?一旦我将这个"简单"的案例工作,我还需要嵌套Include
s(即如果CustomerPromo
表有关系Customer
).
编辑
包括所有相关代码.其余的是LINQ to SQL或WCF数据服务配置.这就是:
[WebGet] [OperationContract] public PromoCode[] Test() { using (MsSqlDataContext db = new MsSqlDataContext()) { return db.PromoCodes.Include(x => x.CustomerPromos).ToArray(); } }
如果我直接通过浏览器调用它(例如http://:
),我会收到重置连接消息,并且必须查找WCF日志才能找到" DataContext accessed after Dispose.
".如果我通过网页中的AJAX调用进行相同的查询,我会收到状态的AJAX错误error
(这就是全部!).
当我实际上没有要获取的任何子数据时,我过早地发布了上一个答案.当时我只对获取父数据感兴趣,而且答案有效.
现在当我真正需要子数据的时候,我发现它并没有完全发挥作用.我发现这篇文章表明.Include()
(他说,Including()
但我不确定这是不是一个错字)已被删除,并且正确的解决方案是使用DataLoadOptions
.此外,我还需要启用单向序列化.
最重要的是,我不再需要了DeferredLoadingEnabled
.所以现在最终的代码如下所示:
using (MsSqlDataContext db = new MsSqlDataContext()) { DataLoadOptions options = new DataLoadOptions(); options.LoadWith(p => p.CustomerPromos); db.LoadOptions = options; return db.PromoCodes.ToArray(); }
设置后Unidirectional Serialisation
,它将很乐意返回父对象,而无需加载子项或显式设置DeferredLoadingEnabled = false;
.