gpt4 book ai didi

entity-framework - Entity Framework 代码优先的性能

转载 作者:行者123 更新时间:2023-12-02 02:13:46 24 4
gpt4 key购买 nike

我们有 EF( Entity Framework )的性能问题。调用 EF 的第一个屏幕比第二个屏幕需要更多的时间来打开。如果第二屏与第一屏相同或完全不同,加载时间没有区别;所有其他屏幕都会很快。

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

  • 通用框架
  • 项目框架
  • 项目部门

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

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

    生成的实体是 T4 模板为每个表列创建的具有属性的类。实体是一个扩展生成类的类,程序员可以在其中添加代码。这是映射到表的类。当修改其他类或将数据保存到数据库时,将调用验证器类。
    我们需要找到一种方法,先用代码预先生成我们的 View ,或者先用 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
    }
    }

    参数文件
    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; } }
    }
    }

    参数验证器.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 的一篇博文:

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

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

    关于entity-framework - Entity Framework 代码优先的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11564482/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com