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 string BookId { get; set; } 4 public int BookshelfId { get; set; } 5 public Book Book { get; set; } 6 public Bookshelf Bookshelf { get; set; } 7 }
同时对 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
查看当前数据库结构: