資料庫表間多對多關係(附帶額外欄位)的實體類(POJO 或 POCO)表示

来源:http://www.cnblogs.com/hiwangzi/archive/2017/05/26/6910219.html
-Advertisement-
Play Games

在實際的應用場景中,兩個實體之間不只是簡單的一對一關係,還會出現多對多關係,同時還有可能會出現多對多關係還附帶有其他欄位的情況。本文通過幾個例子,對錶間多對多關係的實體類代碼表示方法進行描述。這種設計方法,並不只是在使用 ORM 框架時需要,事實上,它是 POCO 及簡單 Java 類(POJO)的... ...


介紹

在之前的 Entity Framework 快速上手介紹 之中,兩個實體之間只是簡單的一對一關係,而在實際的應用場景中,還會出現多對多關係,同時還有可能會出現多對多關係還附帶有其他欄位的情況。

下麵以幾個例子,對表間多對多關係的類表示加以更加詳細地描述。雖然兩個場景舉例是使用的 C# 及 Entity Framework(Model First) 框架自動生成資料庫、實體類。但這種設計方法,並不只是在使用 ORM 框架時需要,事實上,它是 POCO 及簡單 Java 類(POJO)的設計原則之一。

場景實例

場景一

在考慮多對多關係還附帶有欄位的情況之前,讓我們先看一下,多對多關係但不附帶額外欄位的情況下,實體類代碼的表示。

此處使用 Entity Framework(Model First),快速將 model diagram 轉為資料庫中的表及實體類。

假設的場景是學生選課,一名學生可以選多門課,一門課也可以被多個學生選擇。E-R 圖如下所示:

對應自動生成的資料庫如下:

  • StudentSet
  • CourseSet
  • CourseRegistrationSet
    • 其中 Course_Id 與 Students_Id(註:此處詞尾(s)負數的原因參見上面 E-R 圖中右邊的 Properties 中 End1 Navigation Property 的設置)分別以另外兩張數據表的 Id 主鍵作為外鍵。
    • 同時 Course_Id與 Students_Id 兩者聯合做 CourseRegistrationSet 表的主鍵。

對應自動生成實體類的代碼如下:

  • Student.cs

    namespace Model
    {
    using System;
    using System.Collections.Generic;
    
    public partial class Student
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Student()
        {
            this.Course = new HashSet<Course>();
        }
    
        public int Id { get; set; }
        public string 學號 { get; set; }
        public string 姓名 { get; set; }
    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Course> Course { get; set; }
    }
    }
  • Course.cs

    namespace Model
    {
    using System;
    using System.Collections.Generic;
    
    public partial class Course
    {
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
        public Course()
        {
            this.Students = new HashSet<Student>();
        }
    
        public int Id { get; set; }
        public string 課程名稱 { get; set; }
        public string 學分 { get; set; }
    
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
        public virtual ICollection<Student> Students { get; set; }
    }
    }

    分析

  • 資料庫表之間一對一、一對多的關係在代碼中是通過 對象引用對象數組/List等形式的引用 實現的。
  • 從實例中可以看出,CourseRegistrationSet 表中的多對多關係在代碼中的表現形式同樣是實體類中的 對象List等形式的引用,只不過多對多關係是多個實體類中都存在其他實體類對象List的引用

場景二

現在讓我們增加一個需求,實際應用之中,資料庫不可能僅僅存儲某學生選了某門課程這些信息,同時還需要保存選課時間、操作人、成績等等信息。

現在讓我們為 CourseRegistrationSet 表增加一個欄位——成績。

  • CourseRegistrationSet

同時我們需要更新一下程式中的代碼,這時候問題出現了

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

-Advertisement-
Play Games
更多相關文章
  • 作業 1, ATM:模擬實現一個ATM + 購物商城程式額度 自定義實現購物商城,買東西加入 購物車,調用信用卡介面結賬可以提現,手續費5%支持多賬戶登錄支持賬戶間轉賬記錄每月日常消費流水提供還款介面ATM記錄操作日誌提供管理介面,包括添加賬戶、用戶額度,凍結賬戶等。。。用戶認證用裝飾器程式結構:A... ...
  • 1、類載入子系統:負責從文件系統或者網路中載入Class信息,載入的信息存放在一塊稱之為方法區的記憶體空間。 2、方法區:就是存放類信息、常量信息、常量池信息、包括字元串字面量和數字常量等。方法區是輔助堆棧的塊永久區,解決堆棧信息的產生,是先決條件。 3、Java堆:再java虛擬機啟動的時候建立Ja ...
  • GetConsoleTitle函數 來源:https://msdn.microsoft.com/en us/library/windows/desktop/ms683174(v=vs.85).aspx 作用 獲取當前控制台視窗的標題 語法 參數 lpConsoleTitle 用於保存控制台標題。若設 ...
  • std::string s1 = R"(Name="Hello World ... ")"; std::string s2 = R"-(Name="(Hello World ... )")-"; std::string s3 = R"-(Name="Hello World ... ")-"; std... ...
  • 在java里, 我們可以使用Executors.newFixedThreadPool 來創建線程池, 然後就可以不停的創建新任務,並用線程池來執行了。 在提交任務時,如果線程池已經被占滿,任務會進到一個隊列里等待執行。 這種機制在一些特定情況下會有些問題。今天我就遇到一種情況:創建線程比線程執行的速 ...
  • hljs.initHighlightingOnLoad(); SetConsoleScreenBufferSize函數 來源:https://msdn.microsoft.com/en us/library/windows/desktop/ms686044(v=vs.85).aspx 作用 指定控制 ...
  • 一些事情久久不能釋懷,於是最近學習了下最短路的演算法,希望我能變得輕鬆些。 dijkstra是一種單源最短路演算法。在沒有負權值的圖上,vi..vj..vk是vi到vk最短路的話,一定要走vi到vj的最短路。所以每次取出到起點距離最小的點,從該點出發更新鄰接的點的距離,如果更新成功則把新點加入prior ...
  • 也許很多朋友在學習NIO的時候都會感覺有點吃力,對裡面的很多概念都感覺不是那麼明朗。在進入Java NIO編程之前,我們今天先來討論一些比較基礎的知識:I/O模型。下麵本文先從同步和非同步的概念 說起,然後接著闡述了阻塞和非阻塞的區別,接著介紹了阻塞IO和非阻塞IO的區別,然後介紹了同步IO和非同步IO... ...
一周排行
    -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# ...