Entity framework 首先是实体框架代码的性能
EF(实体框架)存在性能问题。第一个调用EF的屏幕比第二个屏幕花费更多的时间打开。如果第二个屏幕与第一个屏幕相同或完全不同,则加载时间没有差异;所有其他屏幕都会很快 我们使用代码优先API创建EF的“数据库优先”版本。为此,我们使用T4模板从数据库表生成entities类。一个类由表创建。它们在“OnModelCreating()”中映射。我们决定这样做,因为我们需要在三个不同的层(名称空间和程序集)中分离实体:Entity framework 首先是实体框架代码的性能,entity-framework,c#-4.0,orm,ef-code-first,edmx,Entity Framework,C# 4.0,Orm,Ef Code First,Edmx,EF(实体框架)存在性能问题。第一个调用EF的屏幕比第二个屏幕花费更多的时间打开。如果第二个屏幕与第一个屏幕相同或完全不同,则加载时间没有差异;所有其他屏幕都会很快 我们使用代码优先API创建EF的“数据库优先”版本。为此,我们使用T4模板从数据库表生成entities类。一个类由表创建。它们在“OnModelCreating()”中映射。我们决定这样做,因为我们需要在三个不同的层(名称空间和程序集)中分离实体: 共同框架 项目框架 项目部门 这些层中每个层的实体都需要链接到前面层中的其他实体。
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
}
}
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; } }
}
}
ParameterValidatorBase.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
}
}
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; } }
}
}
最简单的方法是在ApplicationStart上设置对数据库的调用 因此,查看的第一个“屏幕”将生成第二个呼叫
第一次使用ORM需要一些时间来初始化是很正常的。经过进一步研究,我们发现Pawel Kadluczka的一篇博文:
他创建了一个可用于首先从代码生成视图的视图。您是否尝试过执行一些测量以查看减速的位置?我怀疑它发生在您第一次实例化EF DataContext对象时。我们已经这样做了,但我们希望最小化加载时间。我们知道,通过使用预生成视图,可以消除第一次过载。我们想知道是否可以先对代码执行类似的操作—您不需要预先生成视图—在NHibernate中,您已经在ApplicationStart中设置了SessionFactory,但在EF中我还没有找到等效的方法,但是对上下文进行任何调用也可以。