我正在构建一个Webforms EF6数据库第一个应用程序,并且不确定如何最好地管理DbContext。我查看了很多教程和论坛帖子,但我仍然确定。关于备受青睐的“按要求使用”,我还没有找到一种方法来保存父母和母亲。孩子们一气呵成。我让它使用下面的代码,但我会在何时何地处理上下文?我可以使用这种方法吗? Kamyar shown here的每个请求方法会更好吗?
这就是我现在所拥有的:
public static class ContextManager
{
[ThreadStatic]
private static MyContext current;
public static MyContext MyCurrentContext
{
get{
if (current == null)
current = new MyContext();
return current;
}}
}
加上
var context = ContextManager.MyCurrentContext;
.....
context.SaveChanges();
提前感谢您的帮助!
一个特定的例子是'UserProfile',它包含子对象作为属性,例如'DefaultInvoiceAddress',它从具有所有用户地址的表中返回用户的默认发票地址。在我工作的最后一个Web应用程序中,当用户在配置文件中编辑此地址(例如街道更改)以及来自其他表的其他配置文件信息时,EF将在一个请求中保存来自不同表的所有编辑信息(确保它们'重新附加)。由于我不了解上下文管理,我不知道它是如何完成的,但我们总是为请求分配一个共同的当前上下文。
我遇到了this post by Rick Strahl和this one by Jordan van Gogh - 业务对象/事务似乎是一个答案,但我不太明白如何实现它并且找不到示例。每个HTTP请求的“共享ObjectContext实例”对应于上面提到的Kamyar的答案,考虑到所有事情,这听起来不错。我是否必须明确处理上下文,如果是/ where?有什么缺点吗?
答案 0 :(得分:0)
糟糕的主意。静态完全违背了最佳实践。没有2个用户会同时使用该应用程序吗?哎哟。对于WebForms。
根据要求是最佳选择。
答案 1 :(得分:0)
EF db上下文对象不,无论你如何管理它,我都会重复 NOT threadsafe。跨线程共享数据库上下文可能会产生很多问题,因此最好的方法是,如上所述,每个请求都使用它。
如果您不想进入IoC / DI方面,那么一个非常简单的方法就是在您需要数据库时,只需在using
块中实例化您的上下文,就像这样:
using(var db = new MyContext())
{
// code reading from/writing to database
...
...
}