使用EF第一次加載程序會(huì)很慢,因?yàn)镋F第一次會(huì)生成實(shí)體類和數(shù)據(jù)庫(kù)的對(duì)應(yīng)關(guān)系并做緩存,怎么解決這個(gè)問(wèn)題呢?站在巨人的肩膀上將會(huì)省力很多,博客園的dudu已經(jīng)給出了個(gè)解決方案(EF版本6.0以上)
http://m.survivalescaperooms.com/dudu/p/entity-framework-warm-up.html
主要代碼如下:
using (var dbcontext = new CnblogsDbContext()){ var objectContext = ((IObjectContextAdapter)dbcontext).ObjectContext; var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(Dataspace.CSSpace); mappingCollection.GenerateViews(new List<EdmSchemaError>());}根據(jù)代碼來(lái)看一個(gè)表對(duì)應(yīng)一個(gè)操作類,而我的項(xiàng)目使用的是Code First并使用了倉(cāng)儲(chǔ)模式(EF的三種模式區(qū)別自行查找資料),所以要做修改。
我的項(xiàng)目結(jié)構(gòu)如下:
public class Repository<T> : DbContext, IRepository<T> where T : class,new() { PRivate static readonly string connection = ConfigurationManager.ConnectionStrings["connection"].ConnectionString; private DbSet<T> _dbSet; public Repository() : base(connection) { } public DbSet<T> Query { get { if (_dbSet == null) _dbSet = Set<T>(); return _dbSet; } }}使用的是泛型,所以我的解決方法是使用反射
解決方法:
private static void LoadEFViewMapping() { string[] items = { "Fish.Model" }; foreach (var item in items) { var data = Assembly.Load(item.Trim()); data.GetBaseClass() .Where(g => g.BaseType == typeof(MySQLBase)) .ToList() .ForEach(entity => { Type type = typeof(MySqlRepository<>); type = type.MakeGenericType(entity); var objectContext = ((IObjectContextAdapter)Activator.CreateInstance(type)).ObjectContext; var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace); mappingCollection.GenerateViews(new List<EdmSchemaError>()); }); data.GetBaseClass() .Where(g => g.BaseType == typeof(SqlServerBase)) .ToList() .ForEach(entity => { Type type = typeof(SqlServerRepository<>); type = type.MakeGenericType(entity); var objectContext = ((IObjectContextAdapter)Activator.CreateInstance(type)).ObjectContext; var mappingCollection = (StorageMappingItemCollection)objectContext.MetadataWorkspace.GetItemCollection(DataSpace.CSSpace); mappingCollection.GenerateViews(new List<EdmSchemaError>()); }); } }解釋一下:因我所有的實(shí)體類需執(zhí)行一個(gè)去除EF訪問(wèn)多余數(shù)據(jù)方法(具體參考:http://m.survivalescaperooms.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html),所以所有實(shí)體都繼承一個(gè)基類,而本項(xiàng)目同時(shí)使用MySql和SqlServer數(shù)據(jù)庫(kù)所以有了MySqlBase和SqlServerBase類,這兩個(gè)類都繼承自基類BaseEntity,實(shí)體類根據(jù)訪問(wèn)數(shù)據(jù)庫(kù)分別繼承MySqlBase和SqlServerBase類
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注