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列。因此配置的顺序要尤为注意。

posted @ 2016-03-14 12:56  大木水可  阅读(412)  评论(0编辑  收藏  举报