13.翻譯系列:Code-First方式配置多對多關係【EF 6 Code-First系列】

来源:https://www.cnblogs.com/caofangsheng/archive/2019/04/11/10691475.html
-Advertisement-
Play Games

原文鏈接:https://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx 這裡,我們將學習如何在Student實體和Course實體間配置多對多關係,S ...


原文鏈接:https://www.entityframeworktutorial.net/code-first/configure-many-to-many-relationship-in-code-first.aspx

這裡,我們將學習如何在Student實體和Course實體間配置多對多關係,Student可以參加很多Courses,並且多個學生可以加入同一個Course。

可以看下這篇文章, Entity Relationship 瞭解一下EF是如何管理實體間的一對一,一對多以及多對多關係的。

通過預設約定配置多對多關係

EF 6包含多對多關係的預設約定,你需要在兩個實體間都包含集合類型的導航屬性。例如:Student類應該包含一個集合類型的導航屬性Course,同樣Course類也應該包含一個集合類型的導航屬性Student:

public class Student
{
    public Student() 
    {
        this.Courses = new HashSet<Course>();
    }

    public int StudentId { get; set; }
    [Required]
    public string StudentName { get; set; }

    public virtual ICollection<Course> Courses { get; set; }
}
        
public class Course
{
    public Course()
    {
        this.Students = new HashSet<Student>();
    }

    public int CourseId { get; set; }
    public string CourseName { get; set; }

    public virtual ICollection<Student> Students { get; set; }
}

下麵的上下文類中,包含Student和Course實體:

public class SchoolDBContext : DBContext
{
    public SchoolDBContext() : base("SchoolDB-DataAnnotations")
    {
    }

    public DbSet<Student> Students { get; set; }
    public DbSet<Course> Courses { get; set; }
        
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
    }
}

EF API將會創建Students表和Courses表,同樣還會創建聯接表StudentCourses,StudentCourses表中,包含兩個表中的主鍵作為主鍵以及外鍵:

 

enter description here
enter description here

 

註意:聯接表的名稱就是兩個實體名稱+尾碼s.

使用Fluent API配置多對多關係

上面的例子中,你已經看到了預設的約定為我們創建了多對多關係的表,以及相關的聯接表。我們可以使用FLuent API來配置連接表的名稱和列。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{

    modelBuilder.Entity<Student>()
                .HasMany<Course>(s => s.Courses)
                .WithMany(c => c.Students)
                .Map(cs =>
                        {
                            cs.MapLeftKey("StudentRefId");
                            cs.MapRightKey("CourseRefId");
                            cs.ToTable("StudentCourse");
                        });

}

上面的代碼中,HasMany()方法和WithMany()方法,用來給Student和Course實體配置多對多關係。Map()方法包含一個Action類型的委托,這裡我們傳入lambda,來定製聯接表。MapLeftKey()用來指定Student表中的主鍵名稱(因為我們從Student實體開始配置,所以Student是左表),MapRightKey()用來配置Course表中的主鍵名稱,ToTable用來指定聯接表的名稱。

 

enter description here
enter description here

 

這樣你就通過Fluent API重寫了預設約定,配置了多對多關係。


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

-Advertisement-
Play Games
更多相關文章
  • 導入導出的方法以及引用,可以自行創建一個幫助類 using System;using NPOI.SS.UserModel;using NPOI.XSSF.UserModel;using NPOI.HSSF.UserModel;using System.IO;using System.Data;usi ...
  • 背景 1. 基於之前 "基於Log4Net本地日誌服務簡單實現" 實現本地日誌服務,但是隨著項目開發演進,本地日誌服務滿足不了需求,譬如在預發佈環境或者生產環境,不可能讓開發人員登錄查看本地日誌文件分析。 2. Kafka+ELK日誌服務套件,可以線上日誌服務可以解決上述問題,並且提供豐富報表分析等 ...
  • 1. 下載windbg並安裝。 我下載的是 Windbg 6.12。註意,windbg分32位和64位,由分析環境的位數決定。我這裡安裝的是32位的。安裝過程很簡單,一路next就可以。 2. 準備被調試的程式。 新建一個C#控制台程式,使用如下代碼。編譯~ class Program { stat ...
  • 我們在用EF從資料庫生成模型的時候,預設實體類是沒有註釋的,但是我們已經在資料庫欄位添加說明瞭,能不能自動把註釋也拿過來? 答案是:能。 那麼我們開始 首先隨便開一個ASP.NET MVC項目,我們添加ADO實體數據模型。添加完成後我們打開userinfo.cs(這裡我的模型名稱為userinfo) ...
  • 委托:顧名思義,讓別人幫你辦件事。委托是C#實現回調函數的一種機制。可能有人會問了,回調函數是個啥??? 舉個例子:我現在是一家公司的老闆,公司現在在招聘.NET工程師,我們有一個小姐姐專門負責接受求職者投遞的簡歷,我就告訴這個小姐姐,一旦收到新的簡歷就轉發給我一份。 這個例子里小姐姐要做的工作:給 ...
  • Asp .Net Core 如何讀取appsettings.json配置文件?最近也有學習到如何讀取配置文件的,主要是通過 IConfiguration,以及在Program中初始化完成的。那麼今天給大家介紹下具體如何讀取配置文件的。 首先創建一個讀取配置文件的公共類GetAppsetting,我們 ...
  • 索引: 目錄索引 一.API 列表 1.UpdateAsync() 用於 單表 更新操作 二.API 單表-便捷 方法 舉例-01 生成 SQL 如下: 三.API 單表-便捷 方法 舉例-02 生成 SQL 如下 蒙 2019-04-11 19:45 周四 ...
  • 0x00 前言 最近幾天國外安全研究員Soroush Dalili (@irsdl)公佈了.NET Remoting應用程式可能存在反序列化安全風險,當服務端使用HTTP通道中的SoapServerFormatterSinkProvider類作為通道接收器並且將自動反序列化TypeFilterLev ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...