首页 新闻 搜索 专区 学院

EntityFramework使用的问题

0
悬赏园豆:30 [已解决问题] 解决于 2009-06-26 13:03

一般使用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的

ls176的主页 ls176 | 初学一级 | 园豆:100
提问于:2009-06-17 14:09
< >
分享
最佳答案
0

你的问题我以前也迷惑很久呢呵,现在正好也在研究,说一下我的心得吧

1.如果你在using{}语块中完成整个操作,最后再SaveChanges()的话,那么整个过程理论上是可以被自动优化处理的。因为当你使用Where等方法取数据时,你并不是真的取出来了,它们始终是惰性加载的,就是不到用的时候连执行都不执行,这样在最终提交更改时,只会执行有意义的行为,应该就像你使用SQL语句更新差不多。

2.这里依然遵循这样的原则:需要时再建立,不用时就关闭,减少短时间内多次连接。通常情况下,全局的静态ObjectContext的做法不可取,如果单线程短时间内有频繁操作需求,可以在单线程内短期内共享一个ObjectContext,用后释放掉。

3.我目前也只知道获取查询语句的方法,监视更新等语句的话,好像要依靠工具对数据库监视。

4.可以使用方法参数传递的方式实现,这里没有并发问题,因为你应在单线程内完成,跨类不代表需要跨线程。

如有其它疑惑,可以给我发短消息,欢迎探讨。

斯克迪亚 | 老鸟四级 |园豆:4124 | 2009-06-17 20:09
其他回答(1)
0

你没有用到EF的精髓,一般是只要加载一次即可, 他会存在本地缓存中,同时还应该尽量用Includ 关键字,这样可以把 你所需的表都加载到前台,这样就不用每次都去数据库取了,我们的项目用到的一个页面无论增删改,都只需要用数据库查询一次

chenchunyong | 园豆:5 (初学一级) | 2012-03-16 18:13

如果我直接在数据库中修改了某条数据后。查询出来的还是原来的数据。这不是我想要的结果呀!

支持(0) 反对(0) 曲达子 | 园豆:90 (初学一级) | 2013-08-07 15:39
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册