本文版權歸博客園和作者吳雙共同所有,歡迎轉載,轉載和爬蟲請註明博客園蝸牛原文地址 http://www.cnblogs.com/tdws/p/5874212.html。 最近打算分享一系列.NET Core實用後臺架構,所以首先介紹EF Core。目前國內各大論壇,各位大牛的分享,是按照Micros ...
本文版權歸博客園和作者吳雙共同所有,歡迎轉載,轉載和爬蟲請註明博客園蝸牛原文地址 http://www.cnblogs.com/tdws/p/5874212.html。
最近打算分享一系列.NET Core實用後臺架構,所以首先介紹EF Core。目前國內各大論壇,各位大牛的分享,是按照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 = "[email protected]" }); 10 return _dbContext.SaveChanges(); 11 } 12 }
在ConsoleApp中調用,添加成功
如果我的點滴分享,對您有點滴幫助,歡迎點贊,也為你自己的收穫點贊。
長期分享,歡迎點擊下方關註。祝大家中秋快樂!
晚上喝個紅牛又喝點茶,一直到凌晨五點鐘也不困...腰疼。,有個研究生朋友經常和我說,你見過凌晨三點的西安嗎?現在睡一覺,醒來去問問他見沒見過凌晨五點的蘇州。
最後我有個問題,EF Core目前支持Code First嗎? 沒看到相關文檔。
EF Core如何保證上下文線程內唯一?沒有CallContext...,也沒辦法用HttpContext.Current.Item,有人 操作過嗎?