2012-07-19 106 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

相关问题