使用EF第一次加載程序會很慢,因為EF第一次會生成實體類和數據庫的對應關系並做緩存,怎么解決這個問題呢?站在巨人的肩膀上將會省力很多,博客園的dudu已經給出了個解決方案(EF版本6.0以上)
http://www.cnblogs.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>());
}
根據代碼來看一個表對應一個操作類,而我的項目使用的是Code First並使用了倉儲模式(EF的三種模式區別自行查找資料),所以要做修改。
我的項目結構如下:
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>());
});
}
}
解釋一下:因我所有的實體類需執行一個去除EF訪問多余數據方法(具體參考:http://www.cnblogs.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html),所以所有實體都繼承一個基類,而本項目同時使用MySql和SqlServer數據庫所以有了MySqlBase和SqlServerBase類,這兩個類都繼承自基類BaseEntity,實體類根據訪問數據庫分別繼承MySqlBase和SqlServerBase類
