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;
} }

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

上一篇:Entity Framework Core Like 查询揭秘


下一篇:Issue 5158: Modal dialog present (UnexpectedAlertOpen) issue in IE (Similar issue like 3360)