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我已经修改了我的答案以包含我的实现。