Как избавиться от ObjectContext в реализации EF4.0? - PullRequest
0 голосов
/ 16 июня 2011

У меня следующая структура кода. Это приложение WPF с поддержкой DAL через службы WCF. мы создали наши доменные объекты и передаем их после заполнения из 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. Будет ли реализация using () в методе GetAllFacilities () автоматически избавляться от EDiscDbConnection или мне нужно будет реализовать IDisposable в BaseDAL?
  3. Я очень редко получаю сообщение об ошибке "уже открытый DataReader, связанный с этой командой, который должен быть закрыт первым". Может ли это быть связано с не удалением EDiscDbConnection.

Каковы лучшие практики, которым следуют люди в этих случаях. Пожалуйста, предложите.

1 Ответ

0 голосов
/ 16 июня 2011

Обращаясь к этому вопросу: Entity Framework и пул соединений

Короче говоря, вы должны заключить ваши запросы в оператор using(), чтобы гарантировать, что они собираются после каждого выполнения запроса..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...