Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 首先是实体框架代码的性能_Entity Framework_C# 4.0_Orm_Ef Code First_Edmx - Fatal编程技术网

Entity framework 首先是实体框架代码的性能

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()”中映射。我们决定这样做,因为我们需要在三个不同的层(名称空间和程序集)中分离实体: 共同框架 项目框架 项目部门 这些层中每个层的实体都需要链接到前面层中的其他实体。

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

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

  • 共同框架
  • 项目框架
  • 项目部门
  • 这些层中每个层的实体都需要链接到前面层中的其他实体。我们尝试使用edmx文件,但没有找到如何将不同名称空间中的实体放在同一个edmx中

    我们还生成链接到entities类的其他类。目前,通过T4模板,我们可以生成其他类,程序员可以使用这些类扩展entities属性或添加验证

    生成的实体是T4模板使用每个表列的属性创建的类。实体是一个类,它扩展了生成的类,程序员可以在其中添加代码。这是映射到表的类。当修改其他类或将数据保存到数据库时,将调用validator类。 我们需要找到一种方法,使用code first预生成视图,或者使用edmx获得与code first相同的灵活性

    例如:

    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
        }
    }
    
    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中我还没有找到等效的方法,但是对上下文进行任何调用也可以。