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 生成的代码,如何做呢?
这里提到了这个问题:Unity framework - creating & disposing Entity Framework datacontexts at the appropriate time
最好还是放在using中吧
dudu,您好。
如果放在using 中,那么 就不能将 code first 生成的代码放在其他层,
比如读取新闻表并且进行筛选,包括部分字段映射,这样写起来的话,控制器里的 代码将会非常庞大,请问一般比如博客园是如何处理的?
@周兆坤: 如果using会带来这个问题,那说明你的程序架构有问题,EF只是一个ORM工具。
@dudu: 能否给出合理的架构建议吗?谢谢。
@周兆坤:
我觉得有几个要点:合理分层、关注分离、依赖抽象。
你遇到的EF问题,说明你的程序对EF依赖过多。合理的情况是,除了数据层,其他地方都不应该依赖EF,哪怕引用都不应该有。
关于依赖抽象,推荐阅读:小例子背后的大道理——从DIP中“倒置”的含义说接口的正确使用;
关于架构,建议了解一下DDD(领域驱动设计),知识库中有一些这方面的文章:
@dudu: 好的,谢谢。
@周兆坤: 同意。
作为安全,当然是上面一种好。
不过,在EF(也包括LINQ TO SQL)里,都是用到数据库连接的时候才打开(如果是关闭的),用完后就关闭(如果是此次打开的),所以不存在在数据库资源被占用的问题。
但是,可能在DBCONTEXT里写了一些特殊的东西,需要在DISPOSE里进行销毁,此时就需要使用using了。
另外,在应用中最好使用全局的DBCONTEXT(基于WEB则是会话中,当会话结束的时候销毁),这样,便于数据关联和使用缓存。当你构建不同的DBCONTEXT的时候,他们之间是没有任何关系的。
您好,感谢您的回答。
您说的 应用中最好使用全局的DBCONTEXT 意思是 比如 webform 中 就放在 page_load 上部那个位置是吗?
@周兆坤: 可以这样说吧。
DBCONTEXT占用资源不多,如果担心占用资源也可以用LAZY模式。
@笨笨蜗牛: 单例?
@周兆坤: 对。单例的形式保证使用共享对象,然后在page的unload事件中对对象进行DISPOSE,或者重载PAGE对象的DISPOSE方法,或者重载RENDER方法,在调用BASE的RENDER后进行DISPOSE。
@笨笨蜗牛: 哦。~ 谢谢。