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

来源:http://www.cnblogs.com/tdws/archive/2016/09/15/5874212.html
-Advertisement-
Play Games

本文版權歸博客園和作者吳雙共同所有,歡迎轉載,轉載和爬蟲請註明博客園蝸牛原文地址 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,有人 操作過嗎?

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 到現在,我們已經基本搭建起了項目的框架,但是項目中還存在一個問題,就是儘管層與層之間使用了介面進行隔離,但實例化介面的時候,還是引入了介面實現類的依賴,如下麵的代碼: private IUserService _userService; private IUserService UserServic... ...
  • 之前做過一個桌面翻譯工具,桌面每日一句--桌面翻譯工具(有道翻譯,微軟翻譯,Google翻譯) 獲取金山每日一句,目前因為 金山每日一句頁面改變導致每日一句功能失敗,不過這工具自己用得最多的還是翻譯功能,乾脆把翻譯獨立出來。 另外,最近在逛知乎發現有人分享了必應詞典的第三方api,所以順道拿來完善, ...
  • 新人剛開始學習ASP.NET MVC,若有不足之處希望能得到您的指點,不勝感激! 先來一張項目的層級結構圖: Model:模型層,主要是各種類型、枚舉以及ORM框架,框架完成資料庫和實體類的映射。項目中選用了微軟的開源ORM框架 EntityFramework 6.0 (以下簡稱EF),資料庫則選擇... ...
  • 不常用庫僅作收藏 圖像操作庫 Magick.NET C#的ListView增強組件 ObjectListView Software Protector 是易用的許可證系統 GUI 強大的 C# 組件庫 IKendeLib ...
  • @HtmlHrlper方式創建的標簽,會自動生成一些屬性,其中一些屬性就是關於驗證 如圖示例: 模型註解 通過模型註解後,MVC的驗證,包括前臺客戶端,後臺伺服器的驗證,MVC統統都做了包含,即使用戶在客戶端禁用Javascript,伺服器也會將非法操作進行驗證,當前前提是針對Model實體標識了註 ...
  • 好久沒有寫過Blog, 每天看著開源的Java社區流口水, 心裡滿不是滋味. 終於等到了今年六月份 dotnet core 的正式發佈, 看著dotnet 社區也一步一步走向繁榮, 一片蒸蒸日上的大好景象. 不在綁定Windows, 相信眾位dotneter的春天就要來了 廢話不多說, 早就對dot ...
  • 本配置節相對簡單而且常用 mode的值有如下三種 值 說明 On 指定啟用自定義錯誤。如果未指定 defaultRedirect,用戶將看到一般性錯誤。 Off 指定禁用自定義錯誤。這允許顯示標準的詳細錯誤。 RemoteOnly 指定僅向遠程客戶端顯示自定義錯誤並且向本地主機顯示 ASP.NET ...
  • 為了強調REST的通用性,客戶端不用WCF的形式調用服務,而是採用HttpWebResponse通過編程方式直接訪問,消息格式我們選XML。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...