2011-06-16 17 views
0

我有以下代碼結構。這是通過WCF服務暴露DAL的WPF應用程序。我們已經創建了我們的域實體,並且在從EF實體填充後傳遞它們。如何在EF4.0實現中部署ObjectContext?

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()方法中實現使用()會自動處理EDiscDbConnection還是必須在BaseDAL中實現IDisposable?
  3. 我很少發生錯誤「已經是一個與此命令關聯的打開的DataReader,必須先關閉」。這可能與不配置EDiscDbConnection有關。

什麼是人們在這些情況下遵循的最佳實踐。請建議。

回答

相關問題