Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP DBContext最佳实践_C#_Entity Framework - Fatal编程技术网

C# ASP DBContext最佳实践

C# ASP DBContext最佳实践,c#,entity-framework,C#,Entity Framework,在谷歌搜索了一段时间后,我想知道DBContext(EntityFramework或Linq to Sql)的最佳实践是什么 在实践中,我会撒谎,以了解以下哪种“模式”的缺点较少: 1) 从中获取代码 公共类上下文工厂 { [线程静态] 私有静态DBDataContext上下文; //从web.config获取connectionString 私有静态只读字符串connString=ConfigurationManager.ConnectionString[“ConnectionString”]

在谷歌搜索了一段时间后,我想知道DBContext(EntityFramework或Linq to Sql)的最佳实践是什么

在实践中,我会撒谎,以了解以下哪种“模式”的缺点较少:

1) 从中获取代码

公共类上下文工厂
{
[线程静态]
私有静态DBDataContext上下文;
//从web.config获取connectionString
私有静态只读字符串connString=ConfigurationManager.ConnectionString[“ConnectionString”]。ConnectionString;
公共静态DBDataContext上下文()
{
if(上下文==null)
上下文=新的DBDataContext(connString);
返回上下文;
}
公共静态void FlushContext()
{
context=新的DBSkillDataContext(connString);
} 
} 
这样,每次初始化控制器时,我都使用FlushContext

2) 以这种方式(从中获取代码)

公共类UnitOfWork:IUnitOfWork,IDisposable
{
DBContext=null;
IUserRepository userRepo=null;
IAccountRepository accountRepo=null;
公共工作单元()
{
context=newdbcontext();
userRepo=新的UserRepository(上下文);
accountRepo=新accountRepo(上下文);
}
公共iUserRepo
{
得到
{
返回userRepo;
}
}
公共存储库accountRepo
{
得到
{
返回账户回购;
}
} 
公共空间处置()
{
//如果调用此函数,则用户希望释放
//资源。让我们调用Dispose,它将为我们执行此操作。
处置(真实);
//既然我们已经做了清理工作,现在什么都没有了
//让我们告诉GC以后不要调用它。
总干事(本);
}
受保护的虚拟void Dispose(bool disposing)
{
if(disposing==true)
{
//有人想要所有资源的确定性释放
//让我们释放所有托管资源
上下文=空;
}
}
~UnitOfWork()
{
//对象超出范围,并被调用
//让我们在中调用dispose以释放非托管资源
//当GC启动时,无论如何都会释放托管资源
//下次再跑。
处置(虚假);
}
} 
公共抽象类AController:Controller
{
私人工作;
受保护的工作单元工作单元_
{
获取{return IUnitOfWork;}
}
公共控制器(IUnitOfWork uow)
{
this.IUnitOfWork=uow;
}
}
公共类UserController:AController
{
//如果页面运行,请使用我们的DbContext工作单元
公共用户控制器()
:此(新UnitOfWork())
{
}
//我们将直接从测试项目中调用它
公共用户控制器(UnitOfWork UnitOfWork)
:基础(工作单元)
{
}
公共行动结果索引()
{
List users=UnitOfWork\uU4.usersRepo.GetUsers();
返回视图(用户);
}
}


所以我要问的是,上面哪一项是最佳实践?

不要使DbContext成为静态的。DbContext不是线程安全的,将其设置为静态会使其易于从多个线程使用—特别是在we场景中,这可能导致难以调试/解决错误,甚至可能导致数据损坏。此外,让上下文长时间处于活动状态不是一个好主意——它将跟踪越来越多的实体,因此将逐渐变得越来越慢。它还将阻止GC收集正在跟踪但未使用的对象。 另一个例子要好得多。DbContext本身就是一种工作单元。我不确定我是否会从这里的Reposiory模式开始。我宁愿直接使用DbContext,当模式从我的代码中出现时,并且只有在使用模式有好处的情况下才使用模式(注意,模式需要更多需要理解和维护的代码)