我也是才开始接触的,我描述的也不是很清楚,不知道大神们能不能理解的意思!!
public class DBContextFactory { public static DbContext GetCurrentContext() { //CallContext:保证线程内创建的数据操作上下文是唯一的。 DbContext DbContext = (DbContext)CallContext.GetData("context"); if (DbContext == null) { DbContext = new EFBaseDbContext(); CallContext.SetData("context", DbContext); } return DbContext; } }
//EFBaseDbContext
public class EFBaseDbContext : DbContext { public EFBaseDbContext() : base("SQLConn.Traffic") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { //base.OnModelCreating(modelBuilder); Database.SetInitializer<EFBaseDbContext>(null); modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); } public DbSet<User_Info> Users { get; set; } }
//DAL 获取当前上下文 public DbContext context = DBContextFactory.GetCurrentContext();
(1)你在方法范围使用:using(var db = new EFBaseDbContext()){}就可以。
(2)你在类范围使用:实现IDispose接口就行。
(3)你在多个类中使用:对于每个HttpRequest,所有类共享一个EFBaseDbContext实例。考虑使用IOC工具。
不知道能否保证唯一,没做过。
但是,如果是WEB,你不应该这样去CACHE,即便你是DESKTOP,也不应该使用这个方案,可以考虑用 AutoFac 之类的IoC技术。
谢谢,已经在了解相关文章了。
http://www.cnblogs.com/hanyinglong/archive/2013/04/12/3017309.html 楼主可以看这个博客
谢谢,已经收藏,回家再研究。不过里面的代码看着都好熟悉,
上面有些是胡扯的 你这个代码 只要加上lock应该一点问题都没有
callcontext 本来就是线程级别的容器