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