繁体   English   中英

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

[英]How to dispose ObjectContext in EF4.0 implementation?

我有以下代码结构。 它是一个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;
    }
}

我对此实施有以下疑问

  1. 我们不处置EDiscDbConnection。 这是内存泄漏吗?
  2. 在GetAllFacilities()方法中实现using()是否会自动处理EDiscDbConnection,还是我必须在BaseDAL中实现IDisposable?
  3. 我很少遇到错误“已经与该命令关联的打开的DataReader,必须先关闭它”。 这可以与不处理EDiscDbConnection相关联吗?

在这些情况下,人们遵循的最佳实践是什么。 请提出建议。

提到这个问题: 实体框架和连接池

简而言之,您应该将查询包装在using()语句中,以确保在每次查询执行后对它们进行垃圾回收。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM