如何指示 Entity Framework 到 select 两个具有多个外键的表之间的正确关系?

How do I instruct Entity Framework to select the correct relationship between two tables with multiple foreign keys between them?

我有一个 entity framework 设置,它是使用数据库优先方法生成的。在其中我有一个用户 table 和一个配置文件 table.

User
- UserId
- ProfileId

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

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

  1. 一个用户有一个配置文件 (User.FK_User_Profile User.ProfileId == Profile.ProfileId)
  2. 配置文件由用户创建(Profile.FK_UserCreatedBy Profile.CreatedBy == User.UserId)
  3. 配置文件已被用户修改(Profile.FK_UserModifiedBy Profile.ModifiedBy == User.UserId)

这在数据库中一切正常。不幸的是,当我尝试使用以下 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]

问题是 Left Outer Join 标准。而不是加入

Extent1.UserId = Extent2.UserId

即将加入

Extent1.UserId = Extent2.ModifiedBy

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

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

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

上产生类似这样的东西
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 属性命名并使用表示用户具有个人资料关系的那个,这不应该是一个集合