Entity Framework 7 动态 DbContext 模型缓存 ModelCaching

EF7里实例化DbContext变的有点麻烦了, 下面这个基类会有所帮助:

    public abstract class BaseDbContext : DbContext
    {
        private string _connectionString;

        public BaseDbContext(string connectionString) : base()
        {
            _connectionString = connectionString;
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            base.OnConfiguring(optionsBuilder); 
            optionsBuilder.UseSqlServer(_connectionString).UseRowNumberForPaging(); 
        }
    }

通过重载 OnModelCreating 方法, 可以动态的添加实体类型到DbContext。 该方法在DbContext进行第一次查询时执行,以后会进行全局缓存。

这样显得EF很笨重,不过通过一些处理,可以让它灵活起来。

一种方法是利用泛型类:

    public class DbContext<TEntity1, TEntity2> : BaseDbContext
        where TEntity1: class 
        where TEntity2: class
    {
        public DbSet<TEntity1> Entity1Set { get; set; }
        public DbSet<TEntity2> Entity2Set { get; set; }

        public DbContext(string connectionString) : base(connectionString)
        {
        }
    }

还可以在 OnModelCreating 方法中, 利用一些规则动态添加实体类型。  但是因为模型信息全局缓存的原因,这种动态处理的DbContext,在第一次使用后很难再添加其它实体类型了。

下面这个类可以有效的解决这个问题:

    
//cnblog aC#Coder 原创方法,转载请留此信息。
public class NewDbContext:BaseDbContext { public NewDbContext(string connectionString) : base(connectionString) { } private List<Type> _EntityTypes = new List<Type>(); private static ModelBuilder _modelBuilder; public DbSet<TEntity> AddSet<TEntity>() where TEntity : class { _EntityTypes.Add(typeof(TEntity)); if(_modelBuilder != null) this.OnModelCreating(_modelBuilder); return this.Set<TEntity>(); } protected override void OnModelCreating(ModelBuilder modelBuilder) { foreach (var type in _EntityTypes) { modelBuilder.Entity(type); } base.OnModelCreating(modelBuilder); _modelBuilder = modelBuilder; } }

这样灵活性和缓存的高效性都有了。

原文地址:https://www.cnblogs.com/ybst/p/5039249.html