3

EF(Entity Framework)のパフォーマンスに問題があります。EFを呼び出す最初の画面は、2番目の画面よりも開くのにはるかに長い時間がかかります。2番目の画面が最初の画面と同じであるか、まったく異なる場合でも、読み込み時間に違いはありません。他のすべての画面は高速になります。

Code First APIを使用して、EFの「データベースファースト」バージョンを作成します。これを行うには、T4テンプレートを使用して、データベーステーブルからエンティティクラスを生成します。1つのクラスがテーブルによって作成されます。これらは「OnModelCreating()」でマップされます。エンティティを3つの異なるレイヤー(名前空間とアセンブリ)に分離する必要があるため、この方法を採用することにしました。

  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
    }
}
4

2 に答える 2

2

さらに調査した結果、PawelKadluczkaからのブログ投稿が見つかりました。

VisualStudioコードギャラリーのエンティティフレームワークコードの最初のビュー生成テンプレート

彼は、 CodeFirstからビューを生成するために使用できるT4テンプレートを作成しました。

于 2012-08-07T16:18:15.750 に答える
0

これを回避する最も簡単な方法は、ApplicationStartでデータベースへの呼び出しを設定することです。

したがって、最初に表示される「画面」は2番目の呼び出しを生成します。

そして、ORMの最初の使用が初期化するのに少し時間がかかるのはごく普通のことです。

于 2012-07-19T15:50:54.980 に答える