14、CodeFirsrt多对多关系配置
第一种使用fluentApi配置多对多关系
比如:有一个业务,一张学生表,还有一张课程表,要求,将两表建立多对多关系。
我们可以通过分析:一个学生在课程表里可以有多个课程,每个课程有可以被多个学生同时选择。
配置多对多关系思路:多对多关系,应该有一个中间表,用于关联,关联表至少两个字段,就是两张表的id。
具体操作如下:
第一步:在两个表里写集合类型导航属性
学生表的实体:
public class UserInfo
{
public int Id { get; set; }
[StringLength(128) ,Required]
public string UserName { get; set; }
public string Number { get; set; }
public virtual List<Course> course { get; set; }//用作导航属性使用,因为有可能有多个课程
}
课程实体表:
public class Course
{
public int Id { get; set; }
public string CourseName { get; set; }
public virtual List<UserInfo>useres { get; set; }//可能有多个学生对应这个导航属性
}
第二步
运行,
通过在两个表里写互相的导航属性的集合,就能创建多对多关系。
上面的结果如图:
可以看到运行后给你自动建立了一张表,这个表里用两张表的主键当做联合主键,并且表名就是用两张表的名字连接在一起的,还在后面加了es,而且联合主键的名字格式也是用表名+主键名命名的。
这个新建的表就代表多对多关系的表。
模型里的表只有三个:
第二种,自己使用fluentApi配置表名
这种方法要在第一种方法的基础上才能用
如果不想使用默认的表名,还有联合主键名,可以在上下文对象里的OnModelCreating方法里自己配规则
如下图:
结果如下图:
可以看到名字都不一样了
使用fluentApi,也就是自己配置表名的优点
更灵活,关联表的表名,两个外键可以自己灵活控制
自己维护
最灵活的,不仅可以自己控制表名外键名,还可以自己维护对象已经其他其他字段。
(多对多其实可以理解成两个1对多。可以拆分成两个多对多)
第三种
因为多对多关系是两个一对多,所以可以自己建立一个表的映射,然后在这个表里存这两个一对多的外键即可。
如下图:
被引用的两个表里的导航属性可要可不要,根据需要来:
可以看到表里已经有了两个外键了
这种方式创建多对多关系的表非常灵活,表名和字段名取名和维护也非常容易不像第二种方法那样麻烦。