.NET Core之Entity Framework Core

来源: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嗎? 沒看到相關文檔。

 


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

-Advertisement-
Play Games
更多相關文章
  • 一、在伺服器上打開 22、80、9011埠: iptables -A INPUT -p tcp --dport 9011 -j ACCEPT iptables -A OUTPUT -p tcp --sport 9011 -j ACCEPT iptables -A INPUT -p tcp --dp ...
  • 本來是開始分析uboot代碼的,但是無論是教材還是網上資料都對於我最新下的 uboot原碼結構不同,對於還是小白的我不容易找到相應的文件,下麵是uboot版本中文件組織結構的改變,,,,, u-boot版本情況 網站:http://ftp.denx.de/pub/u-boot/ 1、版本號變化: 2 ...
  • Linux系統實戰項目——sudo日誌審計 由於企業內部許可權管理啟用了sudo許可權管理,但是還是有一定的風險因素,畢竟運維、開發等各個人員技術水平、操作習慣都不相同,也會因一時失誤造成誤操作,從而影響系統運行 因此,徵對sudo提權的操作,便於管理與後續維護,開啟sudo日誌審計功能對用戶執行 su ...
  • 本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程請看:Linux Shell系列教程 函數可以將一個複雜功能劃分成若幹模塊,從而使程式結構更加清晰,代碼重覆利用率更高。 高級語言都支持函數,Shell也不例外。今天就為大家介紹下Shell中函數相關用法。 一、She ...
  • 本文是Linux Shell系列教程的第(十二)篇,更多Linux Shell教程請看:Linux Shell系列教程 在上兩篇文章Linux Shell系列教程之(十)Shell for迴圈和Linux Shell系列教程之(十一)Shell while迴圈中,我們已經對Shell 迴圈語句的fo ...
  • 1. 查看svn 的用戶名,密碼: 找到用戶名,密碼文件,都是明文的,你可以看到 例:linux hjj@hjj-ubuntu:~/.subversion/auth/svn.simple$ ls 9aad7e9f713353a655cf4365926120c7 hjj@hjj-ubuntu:~/.s ...
  • 先上一張鳥哥LVM的圖.感覺這張最清楚了. 這裡到此就結束的.整合一下相關的一些步驟: ...
  • 前言 公司開發使用docker,每次登陸自己開發機總要輸入 ssh user_name@ip_string,然後再確認輸入password,手快了還經常會輸錯。作為一個懶人,肯定要找一個取巧的方式,查看了下ssh命令,由於它要進行一次跟伺服器的加密交互,所以沒有直接附帶密碼登陸的選項,只好作罷。 前 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...