zoukankan      html  css  js  c++  java
  • 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; } }

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

  • 相关阅读:
    分享Kali Linux 2016.2第41周镜像虚拟机
    Visual Studio工具栏中无法选择调试设备
    Xamarin.iOS编译出错
    Xamarin基础命名空间Microsoft.SqlServer.Server
    编译包含Google Play服务App的SDK版本问题
    解决Fiddler无法抓到手机的会话包
    Xamarin.Android编译CPU类型选择方式
    Delphi iOS
    Delphi Android
    CRC16-循环冗余校验
  • 原文地址:https://www.cnblogs.com/ybst/p/5039249.html
Copyright © 2011-2022 走看看