文章出處

回到目錄

對于DotNetCore來說,把大部分組件者放在DI容器里,在startup中進行注入,在類的構造方法中進行使用,如果某些情況下,無法使用這種DI的方式,也可以自己控制數據上下文的生產過程,下面說一下。

一 標準注入+構造方法使用

數據上下文的定義,帶參數的構造方法,注意他和使用什么類型的數據庫沒有關系,只是單純的上下文

   public partial class ErpContext : DbContext, IERPContext
    {
        public ErpContext(DbContextOptions dbContextOptions) : base(dbContextOptions)
        { }
   }

startup類中去注入指定的數據源和數據庫連接串,注意在這里就有了數據庫類型(如sqlserver,mysql,sqllite)和數據連接串

            services.AddDbContextPool<ErpContext>(
                options => options.UseMySql("Server=123.56.31.133;DataBase=erp;UID=front;Password=PlP2017_#Test;charset=utf8;port=3306;SslMode=None"));

而對于使用者來說,就是某個控制器上,也是通過構造方法的DI來實現的,事實上dotnetcore把ioc&di這些模式都集成了

 public ValuesController(ErpContext context)
 {
            this.context = context;
 }

二 不使用注入,直接建立數據上下文,手動建立DbContextOptions對象

這種類似于傳統的方法,數據上下文對象里固定連接串,即某個上下文只屬于某個數據庫!

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseMySql("Server=123.56.31.133;DataBase=erp;UID=front;Password=PlP2017_#Test;charset=utf8;port=3306;SslMode=None");
            base.OnConfiguring(optionsBuilder);
        }

三 還有一種就是,即使用注入,也使用自動構造的方式來建立數據上下文

事實上就是在初始化上下文時,把optionsBuilder做為參數傳進來,這個比較靈活

 public class ERPRepository<T> : EFRepository<T> where T : class
    {
         public ERPRepository() : base(new ErpContext(
            new DbContextOptionsBuilder().UseMySql("Server=123.56.31.133;DataBase=erp;UID=front;Password=PlP2017_#Test;charset=utf8;port=3306;SslMode=None").Options))
        { }
    }

以上幾種方式就是我們使用數據上下文時的方法,還有一點要說話的,當使用了Pomelo.EntityFrameworkCore.MySql這個包包之后,請觀察一下代碼的性能,主要表現在linq的一對多查詢上,代碼如下:

       //一對多,效率很低
            var linq2 = from data1 in crm_customers.GetModel()
                        join data2 in crm_customertag.GetModel()
                        on data1.Id equals data2.CustomerId into list
                        select new
                        {
                            name = data1.AccountantName,
                            orders = list,
                        };

            var result2 = linq2.Take(10).ToList();

感謝各位的閱讀!

我們下次將對一些性能存在問題的代碼進行改善!

回到目錄

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()