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; } }
这样灵活性和缓存的高效性都有了。