[轉].NET Core之Entity Framework Core 你如何創建 DbContext


本文轉自:http://www.cnblogs.com/tdws/p/5874212.html

本文版權歸博客園和作者吳雙共同所有,歡迎轉載,轉載和爬蟲請注明博客園蝸牛原文地址 http://www.cnblogs.com/tdws/p/5874212.html。  

目前國內各大論壇,各位大牛的分享,是按照Microsoft官方文檔,在Web層直接應用EF Core。當然這並沒有什么問題,因為我也要從文檔開始分享。唯一多的一點就是在Dal層中調用DbContext的方法。你以前用的EF6.x,如果在測試代碼中你可以直接new出來,在正式的項目開發中,你控制上下文線程內唯一時,也可以new一個對象。但是!在EF Core中你不能這樣做。

EF6.x中,你的上下文類中是這樣的,在構造方法中沒有任何參數。

你創建線程內唯一的上下文的方法也許是這樣的。

回顧了EF6.x以及以前的版本,下面進入本篇分享的正文。英文官方文檔地址 https://docs.efproject.net/en/latest/platforms/aspnetcore/existing-db.html#

首先我新建了.NET Core WebApplication,ConsoleApp和幾個.NET Core類庫,暫且就先來一個BLL,DAL兩個類庫吧。

解決方案如下:

 在類庫和ConsoleApp和WebApi中都從nuget上安裝好EF Core.SqlServer和design。你可以通過nuget可視化管理也可以通過nuget控制台命令。命令如下:

Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.SqlServer.Design

另外你還需要使用如下命令安裝tool。並且修改Dal層類庫項目的project.json,增加tools節點。

Install-Package Microsoft.EntityFrameworkCore.Tools –Pre

 "tools": { "Microsoft.EntityFrameworkCore.Tools": "1.0.0-preview2-final" }

 

 

由於是DB First,還要創建你的測試數據庫,像下面這樣。

下一步,在你想添加EF的Dal層的nuget控制台,執行以下命令,連接數據庫的相關信息,別忘了修改:

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=AppDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

這就是我的配置。

 Scaffold-DbContext "Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

當然直接執行這段,你一定會遇到一個類似下面的錯誤。由於你的啟動項目是Web,目前你還沒有做項目應該具有的引用,所以它告訴你找不到DAL.dll。

解決辦法當然就是UI引用BLL,BLL引用DAL,重新生成一下后再次執行該命令。還有如果提示讓你dotnet restore一下,那你就執行一下。

 

成功之后你會發現DAL層中多了一個Model文件夾,並且將你的數據庫表映射出實體類,另外還有DbContext類。

接下來看一下如何來處理你的DbContext。Miscrosoft告訴我們需要將如下代碼做修改。

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings. optionsBuilder.UseSqlServer(@"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;"); }

修改后是這樣的:

復制代碼
        //protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) //{ // #warning To protect potentially sensitive information in your connection string, you should move it out of source code. See http://go.microsoft.com/fwlink/?LinkId=723263 for guidance on storing connection strings. // optionsBuilder.UseSqlServer(@"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;"); //} public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
復制代碼

在你的WebAPI或者你的MVC的Startup.cs做如下修改。在其ConfigureServices方法,添加以下代碼,connection字符串依然要記得修改:

  services.AddApplicationInsightsTelemetry(Configuration);   var connection = @"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;"

執行如下添加代碼,看起來和EF6.x沒什么區別。唯一的區別就在於DbContext對象,通過.NET Core框架自動為我們做構造函數依賴注入IOC。

到此我們在Web/WebApi中操作dbContext成功。那么如果你要在Dal層操作,怎么辦?這個_dbContext沒有了依賴注入,誰來給我們對象?自己new一個,可是我們的構造函數擺在那里,不是單純的New就可以操作了。

在你真正着手打算new一個的時候,你發現需要一個DbContextOption<AppDbContext>的對象。

那我們New一個DbContextOption<T>對象吧。你看到重載需要這個參數。

重載說道:你一般初始化一個實例使用重寫DbContext.OnConfiguring方法,或者使用DbContextOptionBulider<T>來創建一個實例。由於我們所需對象為泛型DbContextOption<T>的對象,但是前者的重載方法並非泛型。也可能是我使用有誤,如果你有好的實現,請留下建議。

復制代碼
 1  public class UserDal  2  {  3 static string connection = @"Server=2013-20150707DJ\SQL2012EXPRESS;Database=AppDb;Trusted_Connection=True;";  4 static DbContextOptions<AppDbContext> dbContextOption = new DbContextOptions<AppDbContext>();  5 static DbContextOptionsBuilder<AppDbContext> dbContextOptionBuilder = new DbContextOptionsBuilder<AppDbContext>(dbContextOption);  6 AppDbContext _dbContext = new AppDbContext(dbContextOptionBuilder.UseSqlServer(connection).Options);  7 public int AddUser()  8  {  9 _dbContext.Users.Add(new Users { Name = "ws4", Email = "wscoder@outlook.com" }); 10 return _dbContext.SaveChanges(); 11  } 12 }
復制代碼

在ConsoleApp中調用,添加成功

 

如果我的點滴分享,對您有點滴幫助,歡迎點贊,也為你自己的收獲點贊。

長期分享,歡迎點擊下方關注。祝大家中秋快樂!

晚上喝個紅牛又喝點茶,一直到凌晨五點鍾也不困...腰疼。,有個研究生朋友經常和我說,你見過凌晨三點的西安嗎?現在睡一覺,醒來去問問他見沒見過凌晨五點的蘇州。

最后我有個問題,EF Core目前支持Code First嗎? 沒看到相關文檔。

EF Core如何保證上下文線程內唯一?沒有CallContext...,也沒辦法用HttpContext.Current.Item,有人 操作過嗎?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM