如何在EF4.0实现中配置ObjectContext?

问题描述

| 我有以下代码结构。它是一个WPF应用程序,通过WCF服务公开了DAL。我们已经创建了域实体,并在从EF实体中填充后将其传递给他们。 EDMX生成代码:-
public partial class EdiscDbConnection : ObjectContext
{
    #region Constructors

    /// <summary>
    /// Initializes a new EdiscDbConnection object using the connection string found in the \'EdiscDbConnection\' section of the application configuration file.
    /// </summary>
    public EdiscDbConnection() : base(\"name=EdiscDbConnection\",\"EdiscDbConnection\")
    {
        this.ContextOptions.LazyLoadingEnabled = true;
        OnContextCreated();
    }
}
现在为实例化ObjectContext,我们创建了一个BaseDAL,应用程序中的每个DAL都继承自BaseDal BaseDAL:-
public class BaseDal
{
    public EdiscDbConnection context; // EF Content used for connection to the Database.

    /// <summary>
    /// Base constructor to initilize the Entity Framework Content.
    /// </summary>
    public BaseDal()
    {

        string connstring = ConfigurationManager.ConnectionStrings[\"EdiscDbConnection\"].ConnectionString;
        //Decrypt Connection String
        context = new EdiscDbConnection(Encryption.GetDecryptedString(connstring,\"F045FBC3A427A1018E297BF442216C3FB3D62F51B57A33AC744B6238E05ADB08\"));
        //context = new EdiscDbConnection();

    }
}
DAL如下:
public partial class PatientChartDal : BaseDal
{
  public List<UserFacility> GetAllFacilities()
    {
        List<UserFacility> userFacilities = new List<UserFacility>();

        IEnumerable<Facility> userFac = from fac in context.Facilities
                                        from usrfac in fac.UserFacilityMappings
                                        where fac.IsActive
                                        select fac;

        if (userFac != null && userFac.Count() > 0)
        {
            userFacilities = new List<Domain.UserFacility>();
            foreach (var u in userFac.distinct())
            {
                userFacilities.Add(new Domain.UserFacility()
                {
                    Name = u.Name,FacilityId = u.FacilityId,//FacilityConfiguration = GetFacilityConfiguration(u.FacilityId),//UserConfiguration = GetFacilityUserConfiguration(u.FacilityId,userId),Code = u.Code,//TxAreaID = u.TxAreaID,TimeZone = ConvertTodomainEntity(u.Seed_TimeZone)
                }
                );
            }
        }

        return userFacilities;
    }
}
我对此实施有以下疑问 我们不处置EdiscDbConnection。这是内存泄漏吗? 在GetAllFacilities()方法中实现using()是否会自动处置EdiscDbConnection,还是我必须在BaseDAL中实现Idisposable? 我很少遇到错误“已经有与此命令相关联的打开的DataReader,必须先关闭错误”。这可以与不处置EdiscDbConnection相关联吗? 在这些情况下,人们遵循的最佳实践是什么。请提出建议。     

解决方法

        提到这个问题:实体框架和连接池 简而言之,您应该将查询包装在一个“ 3”语句中,以确保在每次执行查询后将其垃圾回收。