iT邦幫忙

2024 iThome 鐵人賽

DAY 9
0
Modern Web

從零開始教你做AspNet7.0購物網站系列 第 9

Day-09 資料庫上下文(DbContext )

  • 分享至 

  • xImage
  •  

資料庫上下文是什麼?

資料庫上下文是一個在應用程式和資料庫之間充當中介的對象。 它通常用於管理與資料庫的交互,包括連接管理、資料查詢和持久化等任務。 在許多 ORM(物件關聯映射)框架中,資料庫上下文負責映射應用程式中的物件模型到資料庫中的表結構,並執行資料庫操作。

在 Entity Framework Core(EF Core)中,資料庫上下文由 DbContext 類別表示。 DbContext 包含一個或多個 DbSet 屬性,每個屬性代表了一個實體集合,它們對應於資料庫中的表。 DbContext 還提供了一系列方法,用於執行查詢、新增、更新和刪除操作,以及管理資料庫連接和事務。

接著昨天我們指令下完之後,出現的Context檔案會長這樣

using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;

namespace mm4.Models;

public partial class MyContext : DbContext
{
    public MyContext()
    {
    }

    public MyContext(DbContextOptions<MyContext> options)
        : base(options)
    {
    }

    public virtual DbSet<Order> Orders { get; set; }

    public virtual DbSet<User> Users { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

            optionsBuilder.UseMySql("server=localhost;port=3306;database=aspnet;user=root;password=root", ServerVersion.Parse("10.4.29-mariadb"));
        }
    }
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder
            .UseCollation("utf8mb4_unicode_ci")
            .HasCharSet("utf8mb4");

        modelBuilder.Entity<Order>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("PRIMARY");

            entity.ToTable("order");

            entity.Property(e => e.Id)
                .ValueGeneratedNever()
                .HasColumnType("int(11)")
                .HasColumnName("id");
            entity.Property(e => e.Name)
                .HasMaxLength(255)
                .HasColumnName("name");
        });

        modelBuilder.Entity<User>(entity =>
        {
            entity.HasKey(e => e.Id).HasName("PRIMARY");

            entity.ToTable("user");

            entity.Property(e => e.Id)
                .ValueGeneratedNever()
                .HasColumnType("int(11)")
                .HasColumnName("id");
            entity.Property(e => e.Name)
                .HasMaxLength(255)
                .HasColumnName("name");
            entity.Property(e => e.Password)
                .HasMaxLength(255)
                .HasColumnName("password");
        });

        OnModelCreatingPartial(modelBuilder);
    }

    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

這個class使用partial,所以可以拆開放在不同檔案中寫方法,至於什麼是partial我們之後再講~

宣告資料庫

各位可以看到

 public virtual DbSet<Order> Orders { get; set; }

這一行就是將Model宣告進資料庫,只有在資料庫上下文中寫上這一行,之後建立資料庫遷移才會新增這張表上去,沒有加的話他在Asp.Net Core裡面就只是個普通Model,不會跟資料庫連結

資料庫連線

OnConfiguring就是真正連接資料庫的地方拉~

optionsBuilder.UseMySql("server=localhost;port=3306;database=aspnet;user=root;password=root", ServerVersion.Parse("10.4.29-mariadb"));

這一行就是你的資料庫連接資訊,不過通過指令生成的他的連線資訊會寫死在Context檔案裡面,我們需要把它移到外面的appsettings設定檔中去

OnConfiguring方法改成這樣:

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        if (!optionsBuilder.IsConfigured)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

            string connectionString = configuration.GetConnectionString("DefaultConnection");
            optionsBuilder.UseMySql(connectionString, ServerVersion.Parse("10.4.29-mariadb"));
        }
    }

然後在appsettings.json檔案增加:

  "ConnectionStrings": {
    "DefaultConnection": "server=localhost;port=3306;database=aspnet;user=root;password=root"
  }

資料庫關聯

OnModelCreating方法就是之後要設資料庫關聯和資料庫的欄位設定的地方,這裡先帶過之後講關聯資料表再回來


上一篇
Day-08 Entity Framework Core 資料庫安裝
下一篇
Day-10 在Asp.Net Core MVC中建立資料庫遷移
系列文
從零開始教你做AspNet7.0購物網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言