EF框架下的 并行计算问题

烟波钓 2012-11-13 10:32:24
大致情况如下:
1.使用微软的EF框架下,一个数据实体类A下面有一个实体类B类别的属性,在Model层,进行进一步的转化,及把实体层的Model转换为逻辑层的Model

2.在这个转化过程中采用了并行计算的东西,现在出现的问题是这个A的B属性,是的的确确有值的,在调试阶段,通过快速监视,手动读一遍 很ok 都能出来值,但是如果不手动读一遍,这个值就出不来,难道调用ToList()只能强制终止第一层的查询么?

相关代码

//query是通过EF一些筛选条件的Linq语句,并且没有过强制停止延迟计算的操作
IList<PatientOperation> list = query.ToList();
IList<PatientOperationInfo> result = GetOperationListByQuery(list);


//GetOperationListByQuery中的核心代码段
ConcurrentBag<PatientOperationInfo> result = new ConcurrentBag<PatientOperationInfo>();
Parallel.ForEach(query, (model) =>
{
result.Add(DataInfoConvert4Paitent.ConvertToPatientOperationInfo(model));
});
//现在的问题是model 下面的一个实体类别的属性没有完全复制完毕
...全文
331 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
NET小工 2012-11-22
  • 打赏
  • 举报
回复
引用 9 楼 yanbuodiao 的回复:
引用 8 楼 jshi123 的回复:1楼的方法是让你在查询语句中包含进会lazy load的那些poco类,比如: var query = context.Customers.Include("Orders.LineItems.Product").Include("Addresses"); 这个称为eager loading。 你还可以在dbcontext的构造函数……
这回真的要给分了啊
NET小工 2012-11-22
  • 打赏
  • 举报
回复
楼主真小气,竟然不先给分。 那就只给你一个最挫的解决方案,你的A类中的B属性,实际上就是数据库A表中有一个B表的外键是吧?假设有个A类对象a,然后你就用a.B取出B的数据,我说的没错吧。 最挫的方案就是,不要再使用a.B这种句式了,在你的Lambda语句中,老老实实用A join B,Select new{A,B},然后ToList,包你通过。
烟波钓 2012-11-22
  • 打赏
  • 举报
回复
引用 8 楼 jshi123 的回复:
1楼的方法是让你在查询语句中包含进会lazy load的那些poco类,比如: var query = context.Customers.Include("Orders.LineItems.Product").Include("Addresses"); 这个称为eager loading。 你还可以在dbcontext的构造函数里加上下面的语句彻底禁止lazy lo……
那种方法我试过了,完了用Sqlprofiler监听,还是不行,循环里面查数据库了
烟波钓 2012-11-22
  • 打赏
  • 举报
回复
引用 12 楼 jshi123 的回复:
引用 9 楼 yanbuodiao 的回复:那种方法我试过了,完了用Sqlprofiler监听,还是不行,循环里面查数据库了 是吗?这么奇怪,你把查询和实体类结构贴出来看看,或者发个贴问问,为什么用Include做eager loading不起作用?
嗯 我那些本地调试的代码没有迁移到服务器上,我先重现一下 然后开个贴 呵呵
烟波钓 2012-11-22
  • 打赏
  • 举报
回复
引用 10 楼 bianwo 的回复:
楼主真小气,竟然不先给分。 那就只给你一个最挫的解决方案,你的A类中的B属性,实际上就是数据库A表中有一个B表的外键是吧?假设有个A类对象a,然后你就用a.B取出B的数据,我说的没错吧。 最挫的方案就是,不要再使用a.B这种句式了,在你的Lambda语句中,老老实实用A join B,Select new{A,B},然后ToList,包你通过。
好好好 给你分 不过你说的方法我也试过了 呵呵 只要是用了EF自动生成的类 就不行 我会另外开一个帖子
jshi123 2012-11-22
  • 打赏
  • 举报
回复
引用 9 楼 yanbuodiao 的回复:
那种方法我试过了,完了用Sqlprofiler监听,还是不行,循环里面查数据库了
是吗?这么奇怪,你把查询和实体类结构贴出来看看,或者发个贴问问,为什么用Include做eager loading不起作用?
jshi123 2012-11-21
  • 打赏
  • 举报
回复
1楼的方法是让你在查询语句中包含进会lazy load的那些poco类,比如: var query = context.Customers.Include("Orders.LineItems.Product").Include("Addresses"); 这个称为eager loading。 你还可以在dbcontext的构造函数里加上下面的语句彻底禁止lazy load: this.Configuration.LazyLoadingEnabled = false; 不过这样做会严重降低效率,所以还是用督察的方法好了。
烟波钓 2012-11-21
  • 打赏
  • 举报
回复
引用 6 楼 bianwo 的回复:
原因我知道,可惜不好描述,简单讲一下,碰碰运气吧,如果听明白了记得给分。 EF在多表连接的时候,会为每个外键生成一个实体对象的临时引用,但是该引用的生命期与DataContext同步,所以通常只在同一个Lambda语句中使用这个引用。 我敢断定,你两个方法虽然连接的是同一个数据库,但是DataContext对象却不是同一个,所以当运行时执行到GetOperat……
大哥 别卖关子了 我现在全用匿名类实现了 不用EF自动生成的类了 但是这样 就违反了EF框架的初衷 太麻烦了
NET小工 2012-11-21
  • 打赏
  • 举报
回复
原因我知道,可惜不好描述,简单讲一下,碰碰运气吧,如果听明白了记得给分。 EF在多表连接的时候,会为每个外键生成一个实体对象的临时引用,但是该引用的生命期与DataContext同步,所以通常只在同一个Lambda语句中使用这个引用。 我敢断定,你两个方法虽然连接的是同一个数据库,但是DataContext对象却不是同一个,所以当运行时执行到GetOperationListByQuery方法的时候,前一个DataContext已经被回收,自然取不到值。而单步调试的时候,所有连接都是强制常驻内存的,这时候就有值。 200分不是小数字啊,先结贴再告诉你怎么处理。
引用 5 楼 yanbuodiao 的回复:
没人了么? 已经采用另一种方式实现了我想要的性能提升,但就是这个问题没有结果,难道EF框架下,自动生成的实体类就有这个问题么?
烟波钓 2012-11-13
  • 打赏
  • 举报
回复
引用 2 楼 q107770540 的回复:
http://vincentlauzon.wordpress.com/2011/04/11/entity-framework-4-1-deep-fetch-vs-lazy-load-3/
这个网址打不开……
烟波钓 2012-11-13
  • 打赏
  • 举报
回复
引用 1 楼 q107770540 的回复:
Try: TableA.Include("TableB")
督察,情况是这样的,那些底层的东西都是EF自己生成的,我们并没有直接在代码中指定这些关系,是在那个类似实体图的Edmx文件中编辑他们实际的表之间的关系的
q107770540 2012-11-13
  • 打赏
  • 举报
回复
http://vincentlauzon.wordpress.com/2011/04/11/entity-framework-4-1-deep-fetch-vs-lazy-load-3/
q107770540 2012-11-13
  • 打赏
  • 举报
回复
Try: TableA.Include("TableB")
烟波钓 2012-11-13
  • 打赏
  • 举报
回复
没人了么? 已经采用另一种方式实现了我想要的性能提升,但就是这个问题没有结果,难道EF框架下,自动生成的实体类就有这个问题么?

8,494

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧