Working with DbContext
原文地址:http://msdn.microsoft.com/zh-cn/data/jj729737,没有中文翻译;这里人肉翻译一下
让DbContext跑起来
EF允许使用CLR实体对象(类)查询、插入、更新和删除数据。
EF映射你在模型中定义的实体和关系到数据库中。
EF提供以下工具:从数据库中返回实体化数据;跟踪转换为对象的数据变化;管理并发;将对象的变化传回数据库;将对象绑定到控制器。
原始的类只是将数据转换为对象(System.Data.Entity.DbContext)。上下文类在运行时管理实体对象,包括从数据库生成对象,变化跟踪和将数据存入数据库。
本问给予如何管理DbContext的一些指导。
定义个DbContext派生类
建议定义一个派生在自DbContext的上下文类,并显式public一个DbSet集合(泛型)属性。如果你用EF设计器,上下文将被自动生成。如果你用Code First就只能自己敲进去。
public class ProductContext : DbContext { public DbSet<Category> Categories { get; set; } public DbSet<Product> Products { get; set; } }
一旦有了这个上下文,你用这些属性可以查询、添加(添加或者追加方法)或者移除(using Remove)实体的上下文。在上下文对象中访问一个DbSet属性,将开始查询所有的这个类型的实体。注意,访问一个属性并不执行一个查询,执行查询是在:foreach中枚举;在集合操作中枚举如“ToArray”,“ToDictionary”或“ToList”;LINQ操作,如“First”或者“Any”等语句;DbSet的扩展方法“Load”,DbEntityEntry.Reload和Database.ExecuteSqlCommand。
生命周期
上下文的生命周期从他被实例化开始到被释放或者垃圾回收结束。使用"using"就是被控制在块内。当你使用“using”,编译器会自动创建一个try/finally块,并在finally中释放它。
using (var context = new ProductContext()) { // Perform data access using the context }
考虑到关于上下文的生命周期,遵循:
1)当需要长时间运行上下文时:
a)当你载入更多de对象和引用到内存中,上下文的内存消耗会迅速增加,可能会导致性能问题。
b)记住不需要时要释放掉它。
c)如果一个异常导致上下文不可恢复的状态,整个应用程序会终止。
d)查询和更新平凡会导致并发问题的增长。
2)Web程序开发时,让每个请求用一个上下文实例。
3)WPF或者WinForm开发时,每个表单用一个上下文实例。可以使用上下文提供的change-tracking功能
连接
默认情况下,上下文管理数据库的链接。上下在需要的情况下文打开和关闭连接。例如,上下文打开链接去执行一个查询,在所有结果被处理后关闭连接。
如果你想在打开和关闭时候要更多的控制,例如当使用SqlServerCompact打开和关闭连接非常消耗资源,你能用Connection属性进行手动控制。
多线程
上下文不是线程安全的。你依然可以创建多线程应用程序只要一个同实体类的实例不是被多个上下文同时跟踪。
(英语就是倒装倒到吐的节奏……)