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