1. 程式人生 > >ASP.NET Core 打造一個簡單的圖書館管理系統(二)Code First 多對多關係的建立

ASP.NET Core 打造一個簡單的圖書館管理系統(二)Code First 多對多關係的建立

前言:

本系列文章主要為我之前所學知識的一次微小的實踐,以我學校圖書館管理系統為雛形所作。

本系列文章主要參考資料:

微軟文件:https://docs.microsoft.com/zh-cn/aspnet/core/getting-started/?view=aspnetcore-2.1&tabs=windows

《Pro ASP.NET MVC 5》、《鋒利的 jQuery》

 

此係列皆使用 VS2017+C# 作為開發環境。如果有什麼問題或者意見歡迎在留言區進行留言。 

專案 github 地址:https://github.com/NanaseRuri/LibraryDemo

 

 

本章內容:對圖書館系統組成的簡要分析。以及對域模型以及相應資料庫的建立。

知識點:EF 多對多關係的建立、控制器以及動作方法的建立

 

 

一、EF 多對多關係的建立

在上一章中,我假設書架和書籍關係為多對一的關係,而實際上一本書可以放在不同的書架上,如我們學校中的兩個圖書館中不同的書架,因此需要對現有的模型進行更新。

在 EF 中,如果在兩個模型類中同時使用基於另外一方的 ICollection 時會出現異常,因為 EF 無法確定它們之間的外來鍵關係,因此需要引入一箇中間類:

1     public class BookMiddle
2 { 3 public int BookMiddleId { get; set; } 4 public string BookId { get; set; } 5 public int BookshelfId { get; set; } 6 public Book Book { get; set; } 7 public Bookshelf Bookshelf { get; set; } 8 }

 

 

同時對 Book 和 Bookshelf 類進行更改:

 1 public class Book
 2     {                                
 3         /// <summary>
 4         /// 二維碼
 5         /// </summary>
 6         [Key]
 7         public string BarCode { get; set; }
 8 
 9         public string ISBN { get; set; }
10 
11         /// <summary>
12         /// 書名
13         /// </summary>
14         [Required]
15         public string Name { get; set; }         
16 
17         /// <summary>
18         /// 取書號
19         /// </summary>
20         public string FetchBookNumber { get; set; }
21 
22         /// <summary>
23         /// 所在書架
24         /// </summary>
25         //public Bookshelf Bookshelf { get; set; }
26         public ICollection<BookMiddle> BookMiddles { get; set; }
27 
28         /// <summary>
29         /// 借出時間
30         /// </summary>
31         public DateTime BorrowTime { get; set; }
32 
33         /// <summary>
34         /// 到期時間
35         /// </summary>
36         public DateTime MatureTime { get; set; } 
37 
38         /// <summary>
39         /// 是否續借過
40         /// </summary>
41         public bool Renewed { get; set; }
42 
43         /// <summary>
44         /// 持有者,指定外來鍵
45         /// </summary>
46         public Student Keeper { get; set; }
47

 

 1     public class Bookshelf
 2     {
 3         /// <summary>
 4         /// 書架ID
 5         /// </summary>
 6         [Key]
 7         public int BookshelfId { get; set; }
 8 
 9         /// <summary>
10         /// 書架的書籍類別
11         /// </summary>
12 
13         [Required]
14         public string Sort { get; set; }               
15         /// <summary>
16         /// 最小取書號
17         /// </summary>
18         [Required]
19         public string MinFetchNumber { get; set; }
20         [Required]
21         public string MaxFetchNumber { get; set; }
22 
23         /// <summary>
24         /// 書架位置
25         /// </summary>
26         [Required]
27         public string Location { get; set; }
28 
29         /// <summary>
30         /// 全部藏書
31         /// </summary>
32         //public ICollection<Book> Books { get; set; }
33         public ICollection<BookMiddle> BookMiddles { get; set; }
34     }

 

 

在 LendingInfoDBContext 新增 BookMiddle 表:

    public class LendingInfoDbContext:DbContext
    {
        public LendingInfoDbContext(DbContextOptions<LendingInfoDbContext> options) : base(options)
        {
        }

        public DbSet<Book> Books { get; set; }
        public DbSet<BookDetails> BooksDetail { get; set; }
        public DbSet<Bookshelf> Bookshelves { get; set; }
        public DbSet<Student> Students { get; set; }
        public DbSet<RecommendedBook> RecommendedBooks { get; set; }
        public DbSet<BookMiddle> BookMiddles { get; set; }
    }

 

為資料庫新增遷移:

add-migration AddBookMiddles -c LibraryDemo.Data.LendingInfoDbContext

更新資料庫:

update-database -c LibraryDemo.Data.LendingInfoDbContext

 

檢視當前資料庫結構: