首页 新闻 搜索 专区 学院

MVC 下 使用 EF code first 是否需要用 using 包含上下文语句(求大项目的文件结构)

1
悬赏园豆:10 [已解决问题] 解决于 2012-06-11 16:01
 using (DB_Context db = new DB_Context())
            {
                 //do something 
      var new=db.news;

            }

//-------------------------------
DB_Context db = new DB_Context();
var new= db.news

如上,

以//-----------为分隔符。

上边是在 ActionResult 中对数据进行操作的时候先用using包住 上下文;

下边 是在 类顶部直接声明对象,然后载 ActionResult 中直接使用。

请问两种方式那种好?

如果我要把 code first 生成的东西放在另外一个项目里 比如 project.web 是界面,project.domain 是 ef 生成的代码,如何做呢?

西安-DB的主页 西安-DB | 初学一级 | 园豆:4
提问于:2012-06-07 16:27
< >
分享
最佳答案
0

这里提到了这个问题:Unity framework - creating & disposing Entity Framework datacontexts at the appropriate time

最好还是放在using中吧

收获园豆:8
dudu | 高人七级 |园豆:38849 | 2012-06-07 18:02

dudu,您好。

如果放在using 中,那么 就不能将  code first 生成的代码放在其他层,

比如读取新闻表并且进行筛选,包括部分字段映射,这样写起来的话,控制器里的 代码将会非常庞大,请问一般比如博客园是如何处理的?

西安-DB | 园豆:4 (初学一级) | 2012-06-07 20:47

@周兆坤: 如果using会带来这个问题,那说明你的程序架构有问题,EF只是一个ORM工具。

dudu | 园豆:38849 (高人七级) | 2012-06-07 21:00

@dudu: 能否给出合理的架构建议吗?谢谢。

西安-DB | 园豆:4 (初学一级) | 2012-06-08 08:46

@周兆坤:

我觉得有几个要点:合理分层、关注分离、依赖抽象。

你遇到的EF问题,说明你的程序对EF依赖过多。合理的情况是,除了数据层,其他地方都不应该依赖EF,哪怕引用都不应该有。

关于依赖抽象,推荐阅读:小例子背后的大道理——从DIP中“倒置”的含义说接口的正确使用

关于架构,建议了解一下DDD(领域驱动设计),知识库中有一些这方面的文章:

http://kb.cnblogs.com/tag/DDD/

dudu | 园豆:38849 (高人七级) | 2012-06-08 09:50

@dudu: 好的,谢谢。

西安-DB | 园豆:4 (初学一级) | 2012-06-08 12:03

@周兆坤: 同意。

無限遐想 | 园豆:3740 (老鸟四级) | 2012-06-08 17:58
其他回答(1)
0

作为安全,当然是上面一种好。

不过,在EF(也包括LINQ TO SQL)里,都是用到数据库连接的时候才打开(如果是关闭的),用完后就关闭(如果是此次打开的),所以不存在在数据库资源被占用的问题。

但是,可能在DBCONTEXT里写了一些特殊的东西,需要在DISPOSE里进行销毁,此时就需要使用using了。

另外,在应用中最好使用全局的DBCONTEXT(基于WEB则是会话中,当会话结束的时候销毁),这样,便于数据关联和使用缓存。当你构建不同的DBCONTEXT的时候,他们之间是没有任何关系的。

收获园豆:2
无之无 | 园豆:5085 (大侠五级) | 2012-06-07 17:31

您好,感谢您的回答。

您说的   应用中最好使用全局的DBCONTEXT 意思是 比如 webform 中 就放在 page_load 上部那个位置是吗?

支持(0) 反对(0) 西安-DB | 园豆:4 (初学一级) | 2012-06-07 20:46

@周兆坤: 可以这样说吧。

DBCONTEXT占用资源不多,如果担心占用资源也可以用LAZY模式。

支持(0) 反对(0) 无之无 | 园豆:5085 (大侠五级) | 2012-06-08 08:28

@笨笨蜗牛: 单例?

支持(0) 反对(0) 西安-DB | 园豆:4 (初学一级) | 2012-06-08 08:48

@周兆坤: 对。单例的形式保证使用共享对象,然后在page的unload事件中对对象进行DISPOSE,或者重载PAGE对象的DISPOSE方法,或者重载RENDER方法,在调用BASE的RENDER后进行DISPOSE。

支持(0) 反对(0) 无之无 | 园豆:5085 (大侠五级) | 2012-06-08 08:53

@笨笨蜗牛: 哦。~ 谢谢。

支持(0) 反对(0) 西安-DB | 园豆:4 (初学一级) | 2012-06-08 12:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册