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对多。可以拆分成两个多对多)


第三种

因为多对多关系是两个一对多,所以可以自己建立一个表的映射,然后在这个表里存这两个一对多的外键即可。
如下图:

被引用的两个表里的导航属性可要可不要,根据需要来:

可以看到表里已经有了两个外键了

这种方式创建多对多关系的表非常灵活,表名和字段名取名和维护也非常容易不像第二种方法那样麻烦。

posted @ 2022-01-11 14:19  青仙  阅读(51)  评论(0编辑  收藏  举报