在上下文中的第一个引用处从数据库加载表

时间:2013-03-19 08:58:50

标签: c# wcf entity-framework entity-framework-4

我正在使用Entity Framework 4.0。我在数据库上做了很多读操作(数据分析)。不会保存任何数据。目前,尽管存在延迟加载,但数据库服务器的I / O操作数量大大减慢了应用程序的速度。我决定将大多数小表加载到内存(.ToList())中,然后生成计算。有没有办法自动读取表中数据的上下文只是第一次引用它并且还没有被生命上下文更新?这个想法是,进一步引用这个表时没有查询数据库,只查看了应用程序的内存。

现在,我使用此代码:

public class cDBReader
{
        private List<RISK_T_MEMBERS> fMembers;

        public List<RISK_T_MEMBERS> Members
        {
            get
            {
                if (fMembers == null)
                    using (RiskEntities context = new RiskEntities(TConfiguration.connectionString))
                    {
                        context.RISK_T_MEMBERS.MergeOption = System.Data.Objects.MergeOption.NoTracking;
                        fMembers = context.RISK_T_MEMBERS.ToList();
                    }

                return fMembers;
            }
            set { fMembers = value; }
        }
}

2 个答案:

答案 0 :(得分:0)

您能否添加更多信息?当前的实施有什么问题?

看起来你需要的是某种缓存。以下是caching上的示例实现。

实现缓存的一种简单(在我看来不太矫枉过正)的方式是this

最后但并非最不重要的是你的任何实现(就像你已经制作的那样)。也许单身模式可以帮到你吗?这是一个单例对象,可以保存全局所需的所有数据,并通过提供当前活动的上下文为您的数据实现获取,如果数据为null,则应用程序使用活动上下文来获取它们。删除和创建上下文也可以在一段时间后加速应用程序(这就是我认为你应该为getData函数提供活动上下文的原因)。

答案 1 :(得分:0)

您可以首先尝试Eager Loading而不是Lazy Loading来完全控制EF加载,只需手动预加载您需要的内容。加载的数据将在一个上下文生存期限内保持活动状态,如果您需要更多并确保数据库是只读的,您可以只存储某个地方,然后在创建新上下文时附加预加载的数据