本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解。
视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR
GitHub源码:https://github.com/hllive/LearnEFCore3.1
Model之间的【多对多】【一对多】【 一对一】的关系怎么设定,或者说数据表之间的【多对多】【一对多】【 一对一】的关系怎么设定;
我们先讲一下这些字段或者叫属性,它们的属性怎么设定,比如说这个name这个属性,它在数据库中的字段类型是NVARCHAR(MAX)
,而实际上它的长度应该有一定限制,比如要求长度不超过100,那可以使用DataAnnotations的attribute[Maxlength(100)]
使用DataAnnotations需要在Nuget中安装System.ComponentModel.Annotations包
添加好attribute后说明Name字段最大长度为100
添加[Required]说明它是必填的
Birth是出生日期,只需要年月日,在数据库中却是DATETIME2(7) ,这里就需要设置数据库为日期类型
add-migration changePlayerColumb
生成成功后再执行
Update-Database
将数据库更新为指定的迁移
其他更多特性请参考:https://www.cnblogs.com/dotnetmvc/p/3734272.html支持的完整特性列表
以下三个Model都是一对多的关系
在三个Model的基础上再建一个Model,叫比赛Game,就是每个队员一个赛季可能要参加很多比赛,而每个比赛也有很多队员同时去参加,所以说这个队员和比赛之间就应该是多对多的关系(M:N),我们使用CFCore是无法直接实现多对多的关系
可以加一个中间表叫GamePlayer,比如说一个队员他本赛季参加了五场比赛那么它就应该是对应的五个GamePlayer一对多的关系,它俩之间是一对多的关系1:M,每场比赛又有多个队员去参加,每个队员就相当于这场比赛的一个GamePlayer,所以说这个比赛和GamePlayer之间也是一对多的关系,这样队员和这个比赛之间就相当于间接地形成了一个这个多对多的关系。
public class Game{ public Game() { GamePalyers = new List<GamePlayer>(); } public Guid Id { get; set; } public int Round { get; set; }//比赛阶段 public DateTimeOffset? StartTime { get; set; }//开始时间 public List<GamePlayer> GamePalyers { get; set; }}
public class GamePlayer{ public Guid PlayerId { get; set; } public Guid GameId { get; set; } //这里也可以体现一对多的关系 public Game Game { get; set; } public Player Player { get; set; }}
override OnModelCreating()
Add-Migration AddMage
执行更新数据库
Update-Database
假设每个队员只能有一份简历,然后这一份简历呢,就属于这一个队员,所以这就属于一对一的关系
//简历public class Resume{ public Guid Id { get; set; } [MaxLength(200)] public string Description { get; set; } public Guid PlayerId { get; set; }//Player外键 public Player Player { get; set; }//Player导航属性}
在Player类中添加简历属性,这样就能实现Resume和Player类的一对一关系
protected override void OnModelCreating(ModelBuilder modelBuilder){ //设置联合主键 modelBuilder.Entity<GamePlayer>().HasKey(x => new { x.PlayerId, x.GameId }); modelBuilder.Entity<Resume>() .HasOne(x => x.Player)//一个Resume拥有一个Player .WithOne(x => x.Resume)//每个Player又带了一个Resume .HasForeignKey<Resume>(x => x.PlayerId);//Resume上又带了一个外键PlayerId}
设定好后执行迁移命令<
Add-Migration AddResumeToOnePlayer
执行更新数据库
Update-Database
如果执行遇到以下错误:请注意默认项目需要选择Data项目
博客文章可以转载,但不可以声明为原创
联系客服