更大模型的EF 6慢度问题

时间:2019-01-09 13:18:08

标签: entity-framework

我正在将EF 6与数据库优先方法一起使用,并且面临速度慢的问题。我的餐桌人数超过600。在这方面的任何帮助都会有所帮助。

我创建了一个dataaccess类,以便使用单例方法获取数据。任何好的链接或文章都可能有所帮助。

让我分享我的数据模型方法

DataAcess.cs

public class DataAccess
{
    internal Model.Entities _ctx = null;
    private static DataAccess self = null;
    public object ModulePermission;

    private DataAccess()
    {
        var tmp = new ConnectionStringBuilder(Utility.GetConnectionString());
        _ctx = new Model.Entities(tmp.CaliberMatrixString);

        // temporarily dissabling the EF entity validation - it should be removed in the next code sync.
        _ctx.Configuration.ValidateOnSaveEnabled = false;
    }

    public static DataAccess Instance
    {
        get
        {
            var context = HttpContext.Current;
            if (context != null)
            {
                const string kApplicationSettings = "ApplicationObject";
                if (context != null && context.Items[kApplicationSettings] != null)
                {
                    var da = context.Items[kApplicationSettings] as DataAccess;
                    return da;
                }

                self = new DataAccess();
                context.Items[kApplicationSettings] = self;
            }
            else
            {
                self = new DataAccess();
            }
            return self;
        }
    }

    public void Save()
    {
        _ctx.SaveChanges();
    }

    internal Model.CaliberMatrixEntities Ctx { get { return _ctx; } }

    public void Dispose()
    {
        if (self != null)
        {
            //DataAccess.Instance.Dispose();
            const string kApplicationSettings = "ApplicationObject";
            var context = HttpContext.Current;
            if (context != null && context.Items[kApplicationSettings] != null)
                context.Items[kApplicationSettings] = null;
            _ctx.Dispose();
            _ctx = null;
            GC.SuppressFinalize(this);
            self = null;
        }
    }

1 个答案:

答案 0 :(得分:0)

600个表是很大的系统大小。需要考虑几个因素,以确定是否可以隔离应用程序/系统的区域以利用较小的DbContext。 (在有界上下文中搜索)使用DB-First方法更容易进行设置,在该方法中,您将EF配置为现有架构,而不是尝试让EF管理架构和迁移。较小的上下文类可以更快地初始化。

另一个考虑因素是,我会谨慎尝试使用静态上下文。这暗示了DbContext的寿命比需要的更长。 DbContext不能很好地“老化”,因为它们的内置更改跟踪意味着它们的内存使用量增加,并且随着它们意识到的实体增多,性能也会下降。有界的上下文将帮助缩短DbContext的启动时间,这意味着您可以使它们短暂存在。