10分鐘系列:NetCore3.1+EFCore三步快速完成資料庫互動

學習中的苦與樂發表於2021-07-23

前言

做程式開發,不管是什麼語言什麼資料庫,其中的ORM(物件關係對映)是必不可少的,但是不管選擇哪一種ORM,都需要了解其中的執行機制,配置幫助類等等。

所以很多ORM都開始進行升級封裝,我們只需要引用即可,可謂是開箱即用,特別是對於初學者來說,快速建站不是夢。

PS:知其然而不知其所以然是不行的,要理解其中的執行機制和原理,不要為了寫程式碼而寫程式碼。

今天他來了,EFCore (Entity FraFramework Core)

Entity Framework Core (EF Core) 是適用於 .NET 的新式物件資料庫對映器。 它支援 LINQ 查詢、更改跟蹤、更新和架構遷移。

EF Core 通過資料庫提供程式外掛模型與 SQL Server/Azure SQL 資料庫、SQLite、Azure Cosmos DB、MySQL、PostgreSQL 和更多資料庫配合使用。

三步實現資料庫互動

1、建立專案

建立一個 ASP .Net Core Web API 專案,命名為 EFCore_NetCoreWebApi (自定義命名,你可以起一個合適的名字),版本選擇 Net  Core 3.1

資料庫是 SqlServer,當然,其他資料庫也是可以的,不影響操作,很方便。

2、引入NuGet包並建立上下文物件

這裡只需要兩個包,一個是EFCore的引用包,一個是資料庫連線的引用包。

在NuGet分別引入下面兩個包,

Microsoft.EntityFrameworkCore

Microsoft.EntityFrameworkCore.SqlServer

 

建立上下文物件

在專案裡面建立一個 EntityDbContext 資料夾,然後在資料夾裡面建立一個 DbContext_first 類,並繼承 EFCore框架中的 DbContext,

  EntityDbContext 資料夾下建立 Entity 資料夾,建立 StudentTable 實體對映。如下展示

PS:(注意,這裡預設是資料庫存在StudentTable表的,如果沒有請先建立,EFCore支援實體對映表到資料庫的,這裡就不體現了,有需要了解的自行百度或私信小編)

using EFCore_NetCoreWebApi.EntityDbContext.Entity;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace EFCore_NetCoreWebApi.EntityDbContext
{
    public class DbContext_first: DbContext
    {
        /// <summary>
        /// 在這裡重寫OnConfiguring的方法來配置資料庫的連線字串
        /// </summary>
        /// <param name="optionsBuilder"></param>
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            //SQL Server/Azure SQL 資料庫、SQLite、Azure Cosmos DB、MySQL、PostgreSQL資料庫連線
            optionsBuilder.UseSqlServer("Data Source=DESKTOP-Q1V1K53\\MSSQLSERVER2012; Initial Catalog=Demo;User Id=sa;Password=0000@CIICSH");
        }

        public DbSet<StudentTable> StudentTable{ get; set; }  //需要操作的資料庫對應的表
    }
}

為了很好的展示,配置連線我寫在程式碼裡,後續可放到配置檔案,注意,NetCore3.1的配置檔案讀取方式和以往不同,注意甄別,如下,需要檢視的點選程式碼,不需要的可以跳過。

10分鐘系列:NetCore3.1+EFCore三步快速完成資料庫互動
1、首先在控制器引入讀配置檔案物件

private readonly IConfiguration _IConfiguration;
public ThirdController(IConfiguration IConfiguration)
{
    _IConfiguration = IConfiguration;
} 

2、然後讀取

var AllowedHosts = this._IConfiguration["AllowedHosts"];
var write = this._IConfiguration["ConnectionStrings:DbWrite"];
var write0 = this._IConfiguration["ConnectionStrings:DbWrite:0"];
var readarray = this._IConfiguration.GetSection("ConnectionStrings").GetSection("DbReads").GetChildren().Select(a => a.Value).ToArray();


3、配置檔案的格式(看需求配置)

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "ConnectionStrings": {
    "DbWrite": "Server=.;Database=LhHt6;Persist Security Info=True;User ID=sa;password=Sasa123;MultipleActiveResultSets=true",
    "DbReads": [
      "Server=.;Database=LhHt6;Persist Security Info=True;User ID=sa;password=Sasa123;MultipleActiveResultSets=true",
      "Server=.;Database=LhHt6;Persist Security Info=True;User ID=sa;password=Sasa123;MultipleActiveResultSets=true",
      "Server=.;Database=LhHt6;Persist Security Info=True;User ID=sa;password=Sasa123;MultipleActiveResultSets=true"
    ]
  },
    "AllowedHosts": "*"
  }
View Code

展示一下建立好後的目錄層級

3、編寫幾行程式碼

Controllers 資料夾下建立一個 StudentController 控制器,並配置路由,編寫程式碼,如下:

using EFCore_NetCoreWebApi.EntityDbContext;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace EFCore_NetCoreWebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class StudentController : Controller
    {
        //查詢
        [HttpGet("GetStudentList")]
        public JsonResult GetStudentList()
        {
            using (var ctx=new DbContext_first())
            {
                var studeltList = ctx.StudentTable.ToList();
                return Json(studeltList);
            }

        }
    }
}

然後我們訪問http://localhost:44571/api/Student/GetStudentList 就查詢到資料了,成功互動 ,除錯檢視一下。

到這裡就完成了資料庫互動了,是不是超少的程式碼,超簡單的邏輯。其他的增刪改一樣的,我們展示一下新增的例子,修改刪除的就不展示了,需要具體瞭解的可以私信或評論區留言。

        //增加
        [HttpGet("StudentInsert")]
        public string StudentInsert()
        {
            using (var ctx = new DbContext_first())
            {
                int count = 0;
                List<StudentTable> modelList = new List<StudentTable>();
                StudentTable model = new StudentTable();
                model.Name = "喜洋洋";
                model.Sex = "";
                model.Age = 10;
                model.ClassName = "發明三班";
                model.CreateTime = DateTime.Now;
                ctx.Add(model);  //單個新增
                count = ctx.SaveChanges();  //提交資料庫互動

                //modelList.Add(model);
                //ctx.AddRange(model);  //批量新增
                //count = ctx.SaveChanges();  //提交資料庫互動

                return count > 0 ? "新增成功" : "新增失敗";
            }
        }

總結

對接進來很簡單,使用也很方便,但是對於複雜sql語句(跨伺服器跨庫多表的查詢)或其他業務場景不滿足怎麼辦?

這個時候就會考慮使用sql語句的方式會不會比較好,呼叫儲存過程是不是更優?在不引入第三方的情況下可以使用ado.net的方式來進行補位,比如:

       //sql連線
string connectionString = "Data Source=DESKTOP-Q1V1K53\\MSSQLSERVER2012; Initial Catalog=Demo;User Id=sa;Password=0000@CIICSH"using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); string sql = ""; sql = "INSERT INTO StudentTable VALUES('灰太狼','男','20','發明三班',GETDATE())"; using (SqlCommand cmd = new SqlCommand(sql, conn)) { cmd.ExecuteNonQuery(); } conn.Close(); conn.Dispose(); }

 

 
歡迎關注訂閱微信公眾號【熊澤有話說】,更多好玩易學知識等你來取
作者:熊澤-學習中的苦與樂
公眾號:熊澤有話說
出處:https://www.cnblogs.com/xiongze520/p/15049031.html
創作不易,任何人或團體、機構全部轉載或者部分轉載、摘錄,請在文章明顯位置註明作者和原文連結。  

 

 

 

相關文章