zoukankan      html  css  js  c++  java
  • EF关系配置之N:N关系

      上文中以User实体类和Role实体类为例,构建了User-Role的多对一关系,本文中,仍以该框架,配置User与Role的多对多关系,以记录二者的不同。

          上文提到,一对多关系的配置既可以通过OnModelConfiguration方法的重写进行配置,也可直接在实体类中定义进行配置,而在多对多关系的配置中,实体类定义的方法便不再可用。原因很简单,多对多关系的定义对数据库产生的变化并非在表内部,而在于新增一个映射关系表(eg:UserRole),在新增的表内以组合主键的形式记录两个实体之间的多对多关联。因此只能在Configuration文件中进行定义多对多关联。

    一、默认配置下的定义方式

             默认配置即是指既不定义新增映射表的名称,也不定义该表内字段名,只定义多对多关系,完全由EF自动生成新增表的所有定义。这种配置方式只需要在Configuration中使用HasMany等语句即可。

       

            如图所示,最后一行语句即为多对多关系的定义。也可在Role表中使用同样的方式进行关系的配置。

            以此种方式生成的关系表,将以HasMany方法中所指向的实体名在前,WithMany方法指向的实体名在后的形式生成表名,以图示为例,则将生成映射关系表RoleUsers,其中Role_ID列在左,User_ID列在右。

            当自定义映射表名和字段时,语法如下图所示:

       

            图中,.Map方法即是标识映射表的配置代码,.ToTable配置映射表名称,.MapLeftKey即表示User表的主键对应到映射表中的名称,而.MapRightKey则表示另一个实体类的主键对应到映射表中的字段名称。在哪个实体内定义,则该实体的主键对应映射表中的左边的列,因此在配置字段名映射关系时切忌顺序胡乱安置。若按下图配置,则会出现问题。

       

             按此图所示,生成的映射表为UserRole表,左边列为UserId,右边列为RoleId,但在实际存储数据进行映射时,将出现如下情况:

       

           即实体类中的RoleId被映射到UserRole表中的UserId列,实体类中的UserId反被映射到UserRole表中的RoleId列。因此配置的顺序要尤为注意。

  • 相关阅读:
    前端开发拥有属于自己的云服务器能做什么?
    C语言编译、链接和运行详解
    C程序运行机制概述
    Java之顺序查找
    C语言注释
    C转义字符
    Java之二维数组基本使用
    Java之类与对象基本使用
    分享些发表技术类文章的平台
    解决蓝奏云链接无法访问问题
  • 原文地址:https://www.cnblogs.com/cleverJoe/p/5275317.html
Copyright © 2011-2022 走看看