DotNetCore跨平臺(tai)~EFCore數據上(shang)下(xia)文的創建方式
對于DotNetCore來說,把大部分組件者放在(zai)DI容器里,在(zai)startup中進行注入,在(zai)類的構(gou)造方法中進行使(shi)用,如(ru)果(guo)某些情況下(xia),無法使(shi)用這種DI的方式(shi),也可以自己控制(zhi)數(shu)據上(shang)下(xia)文的生產過程,下(xia)面說一(yi)下(xia)。
一 標(biao)準(zhun)注入+構造方法(fa)使用
數(shu)據上下(xia)文(wen)的(de)定義,帶參數(shu)的(de)構(gou)造方法,注意(yi)他和(he)使用什么類(lei)型的(de)數(shu)據庫沒(mei)有(you)關系,只是(shi)單純的(de)上下(xia)文(wen)
public partial class ErpContext : DbContext, IERPContext { public ErpContext(DbContextOptions dbContextOptions) : base(dbContextOptions) { } }
startup類中去注(zhu)入指定(ding)的(de)數(shu)(shu)(shu)據(ju)源和數(shu)(shu)(shu)據(ju)庫(ku)連接串(chuan),注(zhu)意在這里就有了數(shu)(shu)(shu)據(ju)庫(ku)類型(如(ru)sqlserver,mysql,sqllite)和數(shu)(shu)(shu)據(ju)連接串(chuan)
services.AddDbContextPool<ErpContext>( options => options.UseMySql("Server=123.56.31.133;DataBase=erp;UID=front;Password=PlP2017_#Test;charset=utf8;port=3306;SslMode=None"));
而對于使用者來說,就(jiu)是(shi)某個控制器(qi)上,也是(shi)通過構造(zao)方(fang)法的(de)(de)DI來實現的(de)(de),事實上dotnetcore把ioc&di這些模式都(dou)集成(cheng)了
public ValuesController(ErpContext context) { this.context = context; }
二 不使用注入,直接建立數據(ju)上下文(wen),手動建立DbContextOptions對象(xiang)
這種類似于傳(chuan)統的方法(fa),數據(ju)上下文對象里固定連(lian)接串,即(ji)某(mou)個(ge)上下文只屬于某(mou)個(ge)數據(ju)庫!
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); }
三(san) 還有一(yi)種(zhong)就(jiu)是,即(ji)使用(yong)(yong)注入(ru),也使用(yong)(yong)自動構造的(de)方(fang)式來建立數據上下文
事實上就是在初始化上下文時,把optionsBuilder做為參數傳(chuan)進來,這個比較靈活
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這(zhe)個包包之后,請觀察一(yi)下(xia)代碼(ma)的(de)性能,主(zhu)要表現在linq的(de)一(yi)對多查詢上,代碼(ma)如下(xia):
//一對多,效率很低 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();
感謝各位的閱讀!
我們(men)下(xia)次將對(dui)一些性(xing)能存(cun)在問題的代碼進行改善!