.NET Core之Entity Framework Core

來源:互聯網
上載者:User

標籤:

本文著作權歸部落格園和作者吳雙共同所有,歡迎轉載,轉載和爬蟲請註明部落格園蝸牛原文地址 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嗎? 沒看到相關文檔。

 

.NET Core之Entity Framework Core

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.