簡體   English   中英

實體框架代碼優先的性能

[英]Performance with Entity Framework Code-First

我們的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
    }
}

經過更多的研究,我們發現了一篇來自Pawel Kadluczka的博客文章:

Visual Studio代碼庫中的實體框架代碼第一視圖生成模板

他創建了一個T4模板 ,可用於從Code First生成視圖。

最簡單的方法是在ApplicationStart上設置對數據庫的調用。

所以觀看的第一個“屏幕”將產生第二個電話。

第一次使用ORM需要一些時間來初始化是很正常的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM