EF多數據庫預熱


使用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類

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM