[TOC] 場景 在一個項目中,使用了多個 且使用同一個資料庫的情況 創建新項目 打開 Visual Studio 2017 “文件” “新建” “項目” 從左菜單中選擇“已安裝” “Visual C ” “.NET Core”。 選擇“ASP.NET Core Web 應用程式”。 輸入“WebA ...
目錄
場景
在一個項目中,使用了多個 DbContext
且使用同一個資料庫的情況
創建新項目
- 打開 Visual Studio 2017
- “文件”>“新建”>“項目”
- 從左菜單中選擇“已安裝”>“Visual C#”>“.NET Core”。
- 選擇“ASP.NET Core Web 應用程式”。
- 輸入“WebApplication”作為名稱,然後單擊“確定”。
- 在“新建 ASP.NET Core Web 應用程式”對話框中:
- 確保在下拉列表中選擇“.NET Core”和“ASP.NET Core 2.1”
- 選擇“Web 應用程式(模型視圖控制器)”項目模板
- 確保將“身份驗證”設置為“無身份驗證”
單擊“確定”
創建第一個模型
- 右鍵單擊“Models”文件夾,然後選擇“添加”>“類”。
- 輸入“FirstModel.cs”作為名稱,然後單擊“確定”。
將此文件的內容替換為以下代碼:
using System.Collections.Generic; using Microsoft.EntityFrameworkCore; namespace WebApplication.Models { public class FirstDbContext : DbContext { public FirstDbContext(DbContextOptions<FirstDbContext> options) : base(options) { } public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public ICollection<Post> Posts { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } } }
生產應用通常會將每個類放在單獨的文件中。 為簡單起見,本教程將這些類放在一個文件中。
創建第二個模型
- 右鍵單擊“Models”文件夾,然後選擇“添加”>“類”。
- 輸入“SecondModel.cs”作為名稱,然後單擊“確定”。
將此文件的內容替換為以下代碼:
using Microsoft.EntityFrameworkCore; namespace WebApplication.Models { public class SecondDbContext : DbContext { public SecondDbContext(DbContextOptions<SecondDbContext> options) : base(options) { } public DbSet<Student> Students { get; set; } } public class Student { public int Id { get; set; } public string Name { get; set; } } }
生產應用通常會將每個類放在單獨的文件中。 為簡單起見,本教程將這些類放在一個文件中。
至此,項目的目錄結構如下:
使用依賴註入註冊上下文
若要使 FirstDbContext
和 SecondDbContext
可用於 MVC 控制器,請在 Startup.cs
中將其註冊為服務。
在應用程式啟動過程中,通過依賴關係註入 註冊服務(如 FirstDbContext),以便能夠通過構造函數的參數和屬性向使用服務的組件(如 MVC 控制器)自動提供該服務。
在 Startup.cs 中,添加以下 using 語句:
using WebApplication.Models; using Microsoft.EntityFrameworkCore;
將以下
手動高亮
的代碼添加到ConfigureServices
方法:public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); var connection = @"Server=你的資料庫地址;Database=MultipleDbContext;User Id=你的資料庫賬號;Password=你的資料庫密碼;"; // 手動高亮 services.AddDbContext<FirstDbContext> // 手動高亮 (options => options.UseSqlServer(connection, x => x.MigrationsHistoryTable("__FirstDbMigrationsHistory"))); // 手動高亮 services.AddDbContext<SecondDbContext> // 手動高亮 (options => options.UseSqlServer(connection, x => x.MigrationsHistoryTable("__SecondDbMigrationsHistory"))); // 手動高亮 }
生產應用通常會將連接字元串放在配置文件或環境變數中。 為簡單起見,本教程在代碼中定義它。
創建資料庫
以下步驟使用遷移創建資料庫。
- “工具”>“NuGet 包管理器”>“包管理器控制台”
運行以下命令創建
FirstDbContext
的遷移:Add-Migration InitialCreate -Context FirstDbContext -OutputDir Migrations\FirstDbContextMigrations Update-Database -Context FirstDbContext
-Context
參數表示要使用的 DbContext
類,請參閱這裡瞭解詳細信息。- “工具”>“NuGet 包管理器”>“包管理器控制台”
運行以下命令創建
SecondDbContext
的遷移:Add-Migration InitialCreate -Context SecondDbContext -OutputDir Migrations\SecondDbContextMigrations Update-Database -Context SecondDbContext
至此,項目的目錄結構如下:
資料庫如下:
需要註意的情況
請避免兩個 DBContext
內的實體有互相主外鍵連接的情況
示例
// FirstDbContext public class FirstDbContext : DbContext { public FirstDbContext(DbContextOptions<FirstDbContext> options) : base(options) { } public DbSet<Blog> Blogs { get; set; } public DbSet<Post> Posts { get; set; } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public ICollection<Post> Posts { get; set; } public int StudentId { get; set; } public Student Student { get; set; } } public class Post { public int PostId { get; set; } public string Title { get; set; } public string Content { get; set; } public int BlogId { get; set; } public Blog Blog { get; set; } } // SecondDbContext public class SecondDbContext : DbContext { public SecondDbContext(DbContextOptions<SecondDbContext> options) : base(options) { } public DbSet<Student> Students { get; set; } } public class Student { public int Id { get; set; } public string Name { get; set; } public ICollection<Blog> Blogs { get; set; } }