一般使用ObjectContext时,都是类似于
using( var oc = new xxxContext() )
{
处理方法...
}
这样的方式,我现在有以下几个疑问,
1.我在修改,删除时,每次都要先查询出实体类,然后才能操作.这样做,不是增加了数据库负担?
2.我在查询时,每次查询都是new一个新的ObjectContext, 而新的ObjectContext里又没有缓存任何实体类,难道要做一个静态类来保持对同一个ObjectContext的引用?如果这样做,多线程并发时要怎么处理?每个方法都lock?
3.大家是怎样在程序获取每次执行的SQL的,主要是用于日志记录?不要告诉我用EntityCommand和ObjectQuery这两个类的ToTraceString方法,这两个只能用来显示查询SQL而已.
4.当一个ObjectContext跨了多个方法,多个类时,又怎样处理并发的?
我现在的处理方式有两种
1.使用全局的静态ObjectContext,然后在每个用到了ObjectContext的方法里使用Lock.
这样做的好处是可以直接使用ObjectContext本身的对象缓存管理,实体对象可以跨方法,类.比较节省数据库资源.坏处是必须使用LOCK,不然并发问题很严重,另外对于EntityFramework的objectStateManager了解不是很清楚,也不知道这样缓存后会不会出现其它问题.
2.在需要使用ObjectContext 的地方,创建新的ObjectContext.
用这个方式,每个地方都要写using( )语句,可以说和lock的代码量抵消.
很想知道大家是怎样使用EntityFramewok的
你的问题我以前也迷惑很久呢呵,现在正好也在研究,说一下我的心得吧
1.如果你在using{}语块中完成整个操作,最后再SaveChanges()的话,那么整个过程理论上是可以被自动优化处理的。因为当你使用Where等方法取数据时,你并不是真的取出来了,它们始终是惰性加载的,就是不到用的时候连执行都不执行,这样在最终提交更改时,只会执行有意义的行为,应该就像你使用SQL语句更新差不多。
2.这里依然遵循这样的原则:需要时再建立,不用时就关闭,减少短时间内多次连接。通常情况下,全局的静态ObjectContext的做法不可取,如果单线程短时间内有频繁操作需求,可以在单线程内短期内共享一个ObjectContext,用后释放掉。
3.我目前也只知道获取查询语句的方法,监视更新等语句的话,好像要依靠工具对数据库监视。
4.可以使用方法参数传递的方式实现,这里没有并发问题,因为你应在单线程内完成,跨类不代表需要跨线程。
如有其它疑惑,可以给我发短消息,欢迎探讨。
你没有用到EF的精髓,一般是只要加载一次即可, 他会存在本地缓存中,同时还应该尽量用Includ 关键字,这样可以把 你所需的表都加载到前台,这样就不用每次都去数据库取了,我们的项目用到的一个页面无论增删改,都只需要用数据库查询一次
如果我直接在数据库中修改了某条数据后。查询出来的还是原来的数据。这不是我想要的结果呀!