EF学习杂记29:如何避免LazyLoad 或 Load() reader中的问题
2010-08-26 17:01
363 查看
如果你有下面这样的代码:
上面的代码将同时打开两个连接,一个为了检索Customers对象, 另一个为了检索当前 Customer相关的Orders.
这样的操作只有在你启用了 Multiple Active ResultSets (aka MARS)功能以后才可以使用,否则会报错
注: 你或许会奇怪我在这里为什么加入了一个 IsInteresting(..) 方法,如果没有这个方法,这里的代码将不够典型,如果你可以避免这种方式,你就可以不告诉数据库做延时加载。例如:如果你预先知道要为所有的Customers添加Order,你就应该使用Include来进行预先加载。
要启用Enabling MARS非常容易,你只需要在你的Connecting string中添加Multiple Active ResultSets=true就可以了,这个对于让EF自动生成的Connection String来说已经自动启用,这里需要注意的只是你手动添加的时候,需要进行手工启用。
var results = from c in ctx.Customers where c.SalesPerson.EmailAddress == “°…-”± select c; foreach(var customer in results) { Console.WriteLine(customer.Name); if (IsInteresting(customer)) { customer.Orders.Load(); foreach(var order in customer.Orders) { Console.WriteLine(“°\t”± + order.Value); } } }
上面的代码将同时打开两个连接,一个为了检索Customers对象, 另一个为了检索当前 Customer相关的Orders.
这样的操作只有在你启用了 Multiple Active ResultSets (aka MARS)功能以后才可以使用,否则会报错
注: 你或许会奇怪我在这里为什么加入了一个 IsInteresting(..) 方法,如果没有这个方法,这里的代码将不够典型,如果你可以避免这种方式,你就可以不告诉数据库做延时加载。例如:如果你预先知道要为所有的Customers添加Order,你就应该使用Include来进行预先加载。
要启用Enabling MARS非常容易,你只需要在你的Connecting string中添加Multiple Active ResultSets=true就可以了,这个对于让EF自动生成的Connection String来说已经自动启用,这里需要注意的只是你手动添加的时候,需要进行手工启用。
相关文章推荐
- EF学习杂记26:如何通过使用Sbub Entity避免不必要的数据库检索
- 提示29. 怎样避免延迟加载或Load()阅读器问题
- EF学习杂记1:如何在继承类中返回指定的类
- EF学习杂记31:如何在EF查询中引入外部函数
- EF学习杂记35:如何编写OfTypeOnly()函数
- EF学习杂记38:如何使用CodeOnly with Astoria
- EF学习杂记3:如何及何时使用贪婪加载
- EF学习杂记30:如何在EF中使用数据库自定义函数
- EF学习杂记34:如何在EF中使用可更新视图
- EF学习杂记39:如何重置Relationships
- EF学习杂记27:如何实现BeforeSave Validation
- 强化学习是如何解决问题的?
- 【问题】N+同步消费问题,来谈如何避免业务坏账
- 如何应付表数据过大的查询问题?(如何尽量避免大表关联)
- 学习如何避免10种最常见的C#误区
- 时间戳函数如何避免效率问题
- PCB设计上如何避免EMC问题
- 如何设计避免多线程编程中的死锁问题
- 从如何解决问题到如何学习算法
- 跳过登陆页面直接访问该jsp文件了,这样不好,请问大家如何避免这种问题?