4.1通过设置外键映射关系

本文关键字:映射 关系 设置 1通 | 更新日期: 2023-09-27 17:54:43

如何告诉该死的实体框架将关系映射到想要的列!

I have 1 table:

     public class ShedPart
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public int GroupId { get; set; }
        public int ParentGroupId { get; set; }
        public string GroupName { get; set; }           
        [ForeignKey("GroupId")]
        [InverseProperty("ParentGroupId")]
        public ICollection<Part> ParentParts { get; set; }
    }

每个Part 可以有多个parentpart…

生成的SQL如下:
 SELECT
`Project1`.`Id`, 
`Project1`.`Name`, 
`Project1`.`GroupId`, 
`Project1`.`ParentGroupId`, 
`Project1`.`GroupName`,
`Project1`.`C1`, 
`Project1`.`Id1`, 
`Project1`.`Name1`, 
`Project1`.`GroupId1`, 
`Project1`.`ParentGroupId1`, 
`Project1`.`GroupName1`
FROM (SELECT
`Extent1`.`Id`, 
`Extent1`.`Name`, 
`Extent1`.`GroupId`, 
`Extent1`.`ParentGroupId`, 
`Extent1`.`GroupName`, 
`Extent2`.`Id` AS `Id1`, 
`Extent2`.`Name` AS `Name1`, 
`Extent2`.`GroupId` AS `GroupId1`, 
`Extent2`.`ParentGroupId` AS `ParentGroupId1`, 
`Extent2`.`GroupName` AS `GroupName1`
CASE WHEN (`Extent2`.`Id` IS  NULL) THEN (NULL)  ELSE (1) END AS `C1`
FROM `Parts` AS `Extent1` LEFT OUTER JOIN `Parts` AS `Extent2` ON `Extent1`.`Id` = `Extent2`.`GroupId`) AS `Project1`
 ORDER BY 
`Id` ASC, 
`C1` ASC}

正如你所看到的,这是错误的,因为它是在Id => GroupId上加入表,当我试图通过ParentGroupId => GroupId加入。

所以我试试这个:

            modelBuilder.Entity<Part>()
            .HasMany(s => s.ParentParts)
            .WithMany()
            .Map(m =>
                     {
                         m.ToTable("parts");
                         m.MapLeftKey("GroupId");
                         m.MapRightKey("ParentGroupId");
                     });

做同样的事情.....似乎实体框架将只映射到关键列!如何让它把我想要的列联系起来?

4.1通过设置外键映射关系

是否尝试提取

[Key]
public int GroupId { get; set; }        
public int ParentGroupId { get; set; } 

到一个有自连接的Group表?这样你就可以有一个Part -> Group的导航属性。

组将包含部件及其父组的集合。

GroupId将是一个主键,您可以自引用ParentGroupId