Entity framework 我的工作单元实现是否会导致内存泄漏?
我以以下方式实现了我的存储库模式和工作单元:Entity framework 我的工作单元实现是否会导致内存泄漏?,entity-framework,Entity Framework,我以以下方式实现了我的存储库模式和工作单元: 有人问我,创建数据库的多个实例(即工作单元)是否会导致内存泄漏?这种实施的缺点是什么?或者,实施是否正确 谢谢。您应该担心的是创建DbContext,因为这很昂贵。 我通常为每个请求使用一个DbContext,而不是在任何地方创建多个DbContext实例 我将它存储在HttpContext对象中,并在请求结束时处理它 你可以找到更多关于它的信息 下面是我修改过的实现。(原文来自上面的链接,使用ObjectContext) 我的上下文类 us
谢谢。您应该担心的是创建
DbContext
,因为这很昂贵。
我通常为每个请求使用一个DbContext
,而不是在任何地方创建多个DbContext
实例
我将它存储在HttpContext
对象中,并在请求结束时处理它
你可以找到更多关于它的信息
下面是我修改过的实现。(原文来自上面的链接,使用ObjectContext)
我的上下文类
using System.Data.Entity;
using System.Data.Objects;
using System.Web;
using Fot.Admin.Models;
namespace Context
{
public static class ContextManager
{
internal const string DB = "MY_DB_CONTEXT";
/// <summary>
/// Get an instance that lives for the life time of the request per user and automatically disposes.
/// </summary>
/// <returns>Model</returns>
public static T AsSingleton<T>() where T : DbContext, new()
{
HttpContext.Current.Items[DB] = (T)HttpContext.Current.Items[DB] ?? new T();
return (T)HttpContext.Current.Items[DB];
}
}
}
使用System.Data.Entity;
使用System.Data.Object;
使用System.Web;
使用Fot.Admin.Models;
命名空间上下文
{
公共静态类ContextManager
{
内部常量字符串DB=“MY\u DB\u CONTEXT”;
///
///获取一个实例,该实例在每个用户的请求生命期内有效,并自动进行处理。
///
///模型
公共静态T AsSingleton(),其中T:DbContext,new()
{
HttpContext.Current.Items[DB]=(T)HttpContext.Current.Items[DB]??新的T();
返回(T)HttpContext.Current.Items[DB];
}
}
}
我的上下文模块
using System;
using System.Data.Entity;
using System.Data.Objects;
using System.Web;
namespace Context
{
/// <summary>
/// Entity Module used to control an Entities DB Context over the lifetime of a request per user.
/// </summary>
public class ContextModule : IHttpModule
{
private const string DB = ContextManager.DB;
void context_EndRequest(object sender, EventArgs e)
{
Dispose();
}
#region IHttpModule Members
public void Dispose()
{
if(HttpContext.Current != null)
{
if (HttpContext.Current.Items[DB] != null)
{
var entitiesContext = (DbContext) HttpContext.Current.Items[DB];
entitiesContext.Dispose();
HttpContext.Current.Items.Remove(DB);
}
}
}
public void Init(HttpApplication context)
{
context.EndRequest += new EventHandler(context_EndRequest);
}
#endregion
}
}
使用系统;
使用System.Data.Entity;
使用System.Data.Object;
使用System.Web;
命名空间上下文
{
///
///实体模块,用于在每个用户的请求生命周期内控制实体数据库上下文。
///
公共类上下文模块:IHttpModule
{
private const string DB=ContextManager.DB;
无效上下文\u EndRequest(对象发送方,事件参数e)
{
处置();
}
#区域IHTTP模块成员
公共空间处置()
{
if(HttpContext.Current!=null)
{
if(HttpContext.Current.Items[DB]!=null)
{
var entitiesContext=(DbContext)HttpContext.Current.Items[DB];
entitiesContext.Dispose();
HttpContext.Current.Items.Remove(DB);
}
}
}
公共void Init(HttpApplication上下文)
{
context.EndRequest+=新事件处理程序(context_EndRequest);
}
#端区
}
}
在我的web.config中的
下,我添加了以下内容
<add name="ContextModule" type="Context.ContextModule" />
这样可以确保在每个请求之后调用end_请求,以便您可以正确地处理上下文
当您需要DbContext时,用法如下所示
var Context = ContextManager.AsSingleton<MyDBContext>();
var Context=ContextManager.AsSingleton();
在我的工作单元实现中,我有一个DbContext属性,相同的DbContext被传递到存储库构造函数中。这是否意味着我正在使用DbContext?您有没有在HttpContext中存储DbContext的示例?谢谢。这是不正确的-DbContext实例化并不昂贵。@Pawel我根本不是EF专家,但我想我会听从EFProf供应商的建议(上面的链接):@JeeShenLee我已经修改了我的答案以包含我的实现。