实体框架代码优先的性能

时间:2012-07-19 15:45:45

标签: entity-framework c#-4.0 orm ef-code-first edmx

EF(实体框架)存在性能问题。调用EF的第一个屏幕比第二个屏幕打开时间要长得多。如果第二个屏幕与第一个屏幕相同或完全不同,则加载时间没有差异;所有其他屏幕都会很快。

我们使用Code First API创建EF的“数据库优先”版本。为此,我们使用T4模板从数据库表中生成实体类。一个类由表创建。它们在'OnModelCreating()'中映射我们决定采用这种方式,因为我们需要在三个不同的层(命名空间和程序集)中分离我们的实体:

  1. 通用框架
  2. 项目框架
  3. 项目部门
  4. 每个层的实体都需要链接到前一层中的其他实体。我们尝试使用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
        }
    }
    

2 个答案:

答案 0 :(得分:2)

经过更多研究,我们发现了一篇来自Pawel Kadluczka的博客文章:

Entity Framework Code First View Generation Templates On Visual Studio Code Gallery

他创建了一个T4 Template,可用于从Code First生成视图。

答案 1 :(得分:0)

最简单的方法是在ApplicationStart上设置对数据库的调用。

所以观看的第一个“屏幕”将产生第二个电话。

首次使用ORM花一些时间初始化是很正常的。