从DB加载大型数据集。实体框架DB首先

时间:2014-02-11 03:50:39

标签: entity-framework

我有一个实体框架生成CodeModel。 (数据库第一)。 所有这些都是数据库中的视图。         公共类TypeCode         {         公共字符串代码;         public string描述         }       公共类TypeCode1         {         公共字符串代码;         public string描述         }

每次打开应用程序时,我们都会从Views中加载这些代码。这需要花费相当多的时间(3分钟)才能加载一些初始化数据(每次应用程序打开时)。我有1000个这样的TypeCode类型 - TypeCode1,TypeCode2..All的TypeCodes具有相同的结构代码,描述

这就是我们加载代码列表的方式

using(SQlEntitiesContext _context = new SQlEntitiesContext())
{
TypeCodes = _context.TypeCode.ToList();
 TypeCodes1 = _context.TypeCode1.ToList();.....
..
..
..
}

我想构建一个可以加载所有这些列表的Web服务(它们不会更改),并在需要时为每个应用程序实例使用它们。优选地,不为每个应用程序实例查询DB。 Webservice将做更多的东西,不仅仅是Codes.It将加载和缓存所有代码开始。 目前由于网络需要更长的时间

所以我就像这样开始了wcfService

  public interface ICodesService
    {
        [OperationContract]
            Codes LoadCodeData();
    }
     [Serializable]
        [DataContract]
        public class Codes
        {
            [DataMember]
            public List<TypeCode> TypeCodes{ get; set; }
            [DataMember]
            public List<TypeCode1> TypeCodes1{ get; set; }
    }
    }

LoadCodes.svc


    public class LoadCodesService : ICodesService
        {
            Codes _AllCodes = new Codes();
       public Codes LoadCodeData()
            {

                using (CodeEntities _codes = new CodeEntities())
                {

                    _AllCodes.TypeCodes= _codes.TypeCode.ToList();
                    _AllCodes.TypeCodes1= _codes.TypeCodes.ToList();
             }
         }

在客户端

   private void button1_Click(object sender, EventArgs e)
        {
            LoadCodesServiceReference.CodesServiceClient proxy = new LoadCodesServiceReference.CodesServiceClient();
            _codes = proxy.LoadCodeData();


        }

我想知道将这些对象中的任何一个静态化是一个好主意。对于正在加载的应用程序的每个实例。我们可以以某种方式缓存现有代码并在需要时重用。有哪些选择?使用DataReader不是一种选择。

1 个答案:

答案 0 :(得分:0)

我会考虑一个静态工厂方法,它在第一次创建类型时从db查询它们的状态,但之后缓存它们并返回一个用缓存水合而不是调用Db的对象。您可以将缓存逻辑放在工厂方法的后面,随着时间的推移,任何改进都将转移到所有创建的对象。

这样的事情:

public static class SingletonData
{
    static private List<TypeCode> _TypeCode;

    public static List<TypeCode> TypeCode
    {
        get 
        {
            if (_TypeCode!=null)  return _TypeCode;
            using (var db = new SQlEntitiesContainer())
            {
                _TypeCode = db.TypeCodes.ToList();
                return _TypeCode;
            }
        }           
    }

    static private List<TypeCode1> _TypeCode1;

    public static List<TypeCode1> TypeCode1
    {
        get
        {
            if (_TypeCode1 != null) return _TypeCode1;
            using (var db = new SQlEntitiesContainer())
            {
                _TypeCode1 = db.TypeCode1.ToList();
                return _TypeCode1;
            }
        }
    }

}