Entity framework 从数据库加载大型数据集。实体框架数据库优先

Entity framework 从数据库加载大型数据集。实体框架数据库优先,entity-framework,Entity Framework,我有一个实体框架生成的代码模型。首先是数据库。 所有这些都是数据库中的视图。 公共类类型码 { 公共字符串代码; 公共字符串描述 } 公共类类型代码1 { 公共字符串代码; 公共字符串描述 } 每次打开应用程序时,我们都从视图加载这些代码。每次应用程序打开时,仅加载一些初始化数据就需要花费相当多的时间3分钟。我有1000个这样的类型代码类型-类型代码1,类型代码2..所有的类型代码都有相同的结构代码,描述 这就是我们加载代码列表的方式 using(SQlEntitiesContext _cont

我有一个实体框架生成的代码模型。首先是数据库。 所有这些都是数据库中的视图。 公共类类型码 { 公共字符串代码; 公共字符串描述 } 公共类类型代码1 { 公共字符串代码; 公共字符串描述 }

每次打开应用程序时,我们都从视图加载这些代码。每次应用程序打开时,仅加载一些初始化数据就需要花费相当多的时间3分钟。我有1000个这样的类型代码类型-类型代码1,类型代码2..所有的类型代码都有相同的结构代码,描述

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

using(SQlEntitiesContext _context = new SQlEntitiesContext())
{
TypeCodes = _context.TypeCode.ToList();
 TypeCodes1 = _context.TypeCode1.ToList();.....
..
..
..
}
我想构建一个Web服务,它可以加载所有这些列表,它们不会改变,并在应用程序的每个实例需要时使用它们。最好不要为应用程序的每个实例查询数据库。Webservice将做更多的事情,不仅仅是代码。它将加载和缓存所有代码。 由于网络的原因,目前需要更长的时间

所以我就这样开始了WCF服务

  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();
             }
         }

我想知道使这些物体中的任何一个保持静止是否是一个好主意。对于正在加载的应用程序的每个实例。我们是否可以缓存现有代码并在需要时重用。有哪些选择?使用Data Reader不是一个选项。

我会考虑一个静态工厂方法,在第一次创建类型时,从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;
            }
        }
    }

}

这听起来像是要在WCF中使用缓存,而WCF与实体框架无关。你可以在这里找到你的答案:我想试试这个。你有什么例子吗?只是想看看我应该看什么,我编辑了上面的回复。您不必使类成为静态的,但是我认为列表应该是静态的,因此无论创建了多少个类,内存中都只有一个副本。您可以展开它来检查是否在创建单例之后向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;
            }
        }
    }

}