【问题标题】:loading large Datasets from DB. Entity Framework DB first从数据库加载大型数据集。实体框架数据库优先
【发布时间】:2014-02-13 22:53:02
【问题描述】:

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

每次应用程序打开时,我们都会从视图中加载这些代码。这需要相当多的时间(3 分钟),只是为了加载一些初始化数据。(每次应用程序打开时)。我有 1000 种这样的 TypeCode 类型——TypeCode1、TypeCode2..所有的 TypeCode 都具有相同的结构代码、描述

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

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

我想构建一个 web 服务,它可以加载所有这些列表(它们不会改变)并在需要时为应用程序的每个实例使用它们。最好不要为应用程序的每个实例查询数据库。 Webservice 将做更多的事情而不仅仅是代码。它将加载和缓存所有代码以开始。 目前由于网络原因需要更长的时间

所以我就这样启动了 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。

【问题讨论】:

标签: entity-framework


【解决方案1】:

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

类似这样的:

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

}

【讨论】:

  • 我想试试这个。你有什么例子吗?只是为了看看我应该看什么
  • 我在上面编辑了我的回复。您不必将类设为静态,但我认为 List 应该是静态的,因此无论创建多少类,内存中都只有一个副本。您可以扩展它以检查并查看自创建单例以来是否将新项目添加到数据库中,但我并不认为这是您的用例的一部分,所以我没有添加它。希望对您有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-04
相关资源
最近更新 更多