我們有EF(實體框架)的性能問題。調用EF的第一個屏幕比第二個屏幕需要更多的時間來打開。如果第二個屏幕與第一個屏幕相同或者完全不同,則加載時間沒有區別;所有其他屏幕將會很快。使用實體框架代碼的性能 - 首先
我們使用Code First API創建EF的「數據庫優先」版本。爲此,我們使用T4模板從數據庫表中生成我們的實體類。一個類是由表創建的。他們是在「OnModelCreating()」映射我們決定走這條路,因爲我們需要對我們的實體在三個不同層(命名空間和組件)分開:
- 通用框架
- 項目框架
- 項目所屬部門
這些層中的每一層的實體都需要鏈接到先前層中的其他實體。我們嘗試使用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
}
}
您是否嘗試過執行一些測量以查看放緩的位置?我懷疑它是在您首次實例化EF DataContext對象時發生的。 – 2012-07-19 15:49:00