如何指示实体框架在两个表之间有多个外键之间选择正确的关系

本文关键字:之间 关系 选择 两个 指示 何指示 实体 框架 | 更新日期: 2023-09-27 18:34:20

我有一个实体框架设置,它是使用数据库优先方法生成的。在其中,我有一个用户表和一个配置文件表。

User
- UserId
- ProfileId
Profile
- ProfileId
- {unimportant profile details}
- ModifiedOn
- CreatedOn

在每个表中,Id 是它们的主键。问题是两个表之间有 3 个外键关系。

  1. 用户具有配置文件(User.FK_User_Profile User.ProfileId == Profile.ProfileId(
  2. 配置文件由用户创建 (Profile.FK_UserCreatedBy 配置文件创建者 == 用户.用户 ID(
  3. 配置文件由用户修改(Profile.FK_UserModifiedBy配置文件修改者 == 用户.用户 ID(

这一切都在数据库中工作正常。不幸的是,当我尝试使用以下 Linq 查询访问由此生成的 edmx 时:

databaseContext.User.Where(u => u.UserID == SOMEGUID)
            .Select(p => p.Profile.FirstOrDefault())

生成的 SQL 是这样的:

SELECT projected details
  FROM ( SELECT
    [Extent1].UserId as UserId,
    [Extent2].ProfileId as ProfileId,
    [Other fields],
    FROM  [dbo].[User] AS [Extent1]
    LEFT OUTER JOIN [dbo].[Profile] AS [Extent2] ON *[Extent1].[UserID] = [Extent2].[ModifiedBy]*
    WHERE [Extent1].[ProfileID] = efGeneratedId
  )  AS [Project1]

问题是左外连接条件。而不是加入

Extent1.UserId = Extent2.UserId

它正在加入

Extent1.UserId = Extent2.ModifiedBy

这会导致 Linq 检索修改配置文件的所有用户,而不是用户拥有的配置文件。

如何指示 EF 正确映射此查询,或者更可能映射这些关系?

如何指示实体框架在两个表之间有多个外键之间选择正确的关系

由于您没有包含有关生成的 edmx 的任何信息,我将尝试猜测..:这些表的模型应该在 User 类上生成类似以下内容的内容:

int ProfileId {get; set;}
Profile Profile {get; set;} //->An user has A profile
ICollection<Profile> ProfileX {get; set;} //CreatedBy
ICollection<Profile> ProfileY {get; set;} //ModifiedBy

根据你发布的 Sql,linq 的"Profile.FirstOrDefault"是我示例的"ProfileY"集合。

应调整 edmx 属性命名,并使用表示用户具有配置文件关系的属性命名,该关系不应是集合