2012-07-19 111 views
3

我們有EF(實體框架)的性能問題。調用EF的第一個屏幕比第二個屏幕需要更多的時間來打開。如果第二個屏幕與第一個屏幕相同或者完全不同,則加載時間沒有區別;所有其他屏幕將會很快。使用實體框架代碼的性能 - 首先

我們使用Code First API創建EF的「數據庫優先」版本。爲此,我們使用T4模板從數據庫表中生成我們的實體類。一個類是由表創建的。他們是在「OnModelCreating()」映射我們決定走這條路,因爲我們需要對我們的實體在三個不同層(命名空間和組件)分開:

  1. 通用框架
  2. 項目框架
  3. 項目所屬部門

這些層中的每一層的實體都需要鏈接到先前層中的其他實體。我們嘗試使用edmx文件,但是我們沒有找到如何將這些實體放在同一個edmx中的不同名稱空間中。

我們還生成鏈接到實體類的其他類。目前,在我們的T4模板中,我們生成了額外的類,程序員可以使用它來擴展實體屬性或添加驗證。

生成的實體是T4模板使用每個表列的屬性創建的類。實體是擴展生成的類的地方,程序員可以添加代碼。這是映射到表的類。驗證器類在其他類被修改或數據保存到數據庫時被調用。 我們需要找到一種方法,先用代碼預先生成我們的視圖,或者先用edmx代碼具有相同的靈活性。

實施例:

ParameterBase.Generated.cs

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.ComponentModel.DataAnnotations; 
using System.Xml.Linq; 
using Keops.Common.Data; 
using Keops.Common.Validation; 
using Keops.Common.Validators.Framework; 

namespace Keops.Common.Entities.Framework 
{ 
    public abstract class ParameterBase 
     : EntityBase 
     , IHaveAValidator 
     , IDatabaseOriginAware 
    { 
     protected ParameterBase() 
     { 
      ParameterValueList = new HashSet<ParameterValue>(); 
      Validator = new ParameterValidator((Parameter)this); 
     } 

     #region Database columns 

     public string Code 
     { 
      get { return _code; } 
      set 
      { 
       if (_code != value) 
       { 
        _code = value; 
        RaisePropertyChanged("Code"); 
       } 
      } 
     } 
     private string _code; 

     public bool IsEditable 
     { 
      get { return _isEditable; } 
      set 
      { 
       if (_isEditable != value) 
       { 
        _isEditable = value; 
        RaisePropertyChanged("IsEditable"); 
       } 
      } 
     } 
     private bool _isEditable; 

     public bool IsVisible 
     { 
      get { return _isVisible; } 
      set 
      { 
       if (_isVisible != value) 
       { 
        _isVisible = value; 
        RaisePropertyChanged("IsVisible"); 
       } 
      } 
     } 
     private bool _isVisible; 

     public int ParameterID 
     { 
      get { return _parameterID; } 
      set 
      { 
       if (_parameterID != value) 
       { 
        _parameterID = value; 
        RaisePropertyChanged("ParameterID"); 
       } 
      } 
     } 
     private int _parameterID; 

     public int ValueTypeID 
     { 
      get { return _valueTypeID; } 
      set 
      { 
       if (_valueTypeID != value) 
       { 
        _valueTypeID = value; 
        RaisePropertyChanged("ValueTypeID"); 
       } 
      } 
     } 
     private int _valueTypeID; 

     public string Name 
     { 
      get { return _name; } 
      set 
      { 
       if (_name!= value) 
       { 
        _ name = value; 
        RaisePropertyChanged("Name "); 
       } 
      } 
     } 
     private string _ name; 

     #endregion Database columns 

     #region Navigation parents 

     [ForeignKey("ValueTypeID")] 
     public ValueType ValueType 
     { 
      get { return _valueType; } 
      set 
      { 
       if (_valueType != value) 
       { 
        _valueType = value; 
        ValueTypeID = value == null 
         ? 0 
         : value.ValueTypeID; 
        RaisePropertyChanged("ValueType"); 
       } 
      } 
     } 
     private ValueType _valueType; 

     #endregion Navigation parents 

     #region Navigation children 

     public virtual ICollection<ParameterValue> ParameterValueList { get; set; } 

     #endregion Navigation children 

     #region IHaveAValidator 

     public ValidatorBase<Parameter> Validator { get; private set; } 

     IValidator IHaveAValidator.Validator 
     { 
      get { return Validator; } 
     } 

     #endregion 

     #region IDatabaseOriginAware 

     public bool IsFromDatabase { get; set; } 

     string IDatabaseOriginAware.FullTableName { get { return "Framework.Parameter"; } }  

     #endregion 
    } 
} 

parameter.cs中

namespace Keops.Common.Entities.Framework 
{ 
    public class Parameter : Parameter Base 
    { 
     //Add custom methods here 
    } 
} 

ParameterValidatorBase.Generated.cs

using System; 
using System.Data.Entity; 
using System.Linq.Expressions; 
using Keops.Common.Entities.System; 
using Keops.Common.Validation; 

namespace Keops.Common.Validators.System 
{ 
    public abstract class ParameterValidatorBase : ValidatorBase<Parameter> 
    { 
     private readonly Parameter _entity; 

     protected ParameterValidatorBase(Parameter entity) 
      : base(entity) 
     { 
      _entity = entity; 
     } 

     protected ParameterEntity { get { return _entity; } } 
    } 
} 

ParameterValidator.cs

using Keops.Common.Entities.System; 

namespace Keops.Common.Validators.System 
{ 
    public class ParameterValidator : ParameterValidatorBase 
    { 
     internal ParameterValidator(Parameter entity) 
      : base(entity) 
     { 
     } 

     //Define custom rules here 
    } 
} 
+1

您是否嘗試過執行一些測量以查看放緩的位置?我懷疑它是在您首次實例化EF DataContext對象時發生的。 – 2012-07-19 15:49:00

回答

0

最簡單的方法是在ApplicationStart上設置對數據庫的調用。

因此,第一個「屏幕」查看將生成第二個電話。

第一次使用ORM花費一些時間進行初始化是非常正常的。

+0

我們已經這樣做了,但我們希望儘量減少加載時間。我們知道,通過預先生成[edmx]視圖(http://msdn.microsoft.com/zh-cn/library/bb896240.aspx)可以刪除第一次重載。 我們想知道是否有可能做類似的Code-First – 2012-07-19 16:58:53

+0

你不需要預先生成視圖 - 在NHibernate中你將在ApplicationStart中設置SessionFactory,我還沒有找到相當於EF,但對上下文進行任何調用也同樣適用。 – BonyT 2012-07-19 17:19:45

相關問題