Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.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# 如何在存储库模式中处理对象上下文_C#_Asp.net_.net_Entity Framework 4 - Fatal编程技术网

C# 如何在存储库模式中处理对象上下文

C# 如何在存储库模式中处理对象上下文,c#,asp.net,.net,entity-framework-4,C#,Asp.net,.net,Entity Framework 4,我为我的应用程序dat实现了一个存储库模式 我有: public class EFRepository<T> { DbContext // My db context public IQureable<T> GetQuery() { DataContext.CreateQuery(...); } } 公共类eRepository { DbContext//My db context 公共iqreable GetQuery

我为我的应用程序dat实现了一个存储库模式

我有:

public class EFRepository<T>
{
    DbContext // My db context

    public IQureable<T> GetQuery()
    {
        DataContext.CreateQuery(...);
    }
}
公共类eRepository
{
DbContext//My db context
公共iqreable GetQuery()
{
CreateQuery(…);
}
}
现在假设我有一个用户存储库:

公共类UserRepository:EFRepository { 公共UserGetUserDetails(int userId) { GetQuery(),其中(u=>u.Id=userId).First(); } }

我的问题是,当我在派生存储库中使用EF存储库时,如何释放
DbContext
。 假设:
UserRepository:EFRepository
,它使用
GetQuery
,然后我必须处理上下文


如何在通用存储库中实现这一点,有什么好主意吗?

我过去使用过类似的模式,在我的例子中,我实际上继承了
DbContext
,它本身实现了
IDisposable
。如果您在
使用
块中使用
eRepository
或从它派生的类,您应该可以


如果您希望使用
DbContext
成员变量,那么
eRepository
将需要实现
IDisposable
并从其
Dispose
方法调用
DbContext.Dispose()

您应该考虑一下自己拥有什么。(互联网上还有许多其他教程)。其思想是保持相同的dbcontext,并在相同的工作单元中重复使用它。这样,当需要实体时,它们已经被附加到上下文中,等等

现在,这是一个web应用程序,在本例中,您的工作单元将是一个请求。在同一请求中,重用DBContext。有很多方法可以做到这一点,而且我不知道——你会想要像“OnActionExecuting”这样的东西,在这里你可以处理你的上下文


但更好的方法是使用控制模式的反转(有很多框架都使用这个,我主要使用。这将在需要时自动创建某个类的新实例,具体取决于您建议的范围-在本例中为“onRequestScope”。关于IoC还有很多要说的,但不是问题的范围

谢谢。但我有一个问题。在我的报告中添加了任何方法从eRepository派生的ory,使用get查询而不是上下文,get查询使用上下文,因此如何在此处使用dispose。您是否可以用您在本例中所做的示例更新您的问题?非常感谢,实际上这就是您所做的,我使用了unity IOC,他们有一个perexecutelifetimemanager,这意味着共享同一请求的实例。非常感谢。