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