如何指示实体框架在两个表之间有多个外键之间选择正确的关系
本文关键字:之间 关系 选择 两个 指示 何指示 实体 框架 | 更新日期: 2023-09-27 18:34:20
我有一个实体框架设置,它是使用数据库优先方法生成的。在其中,我有一个用户表和一个配置文件表。
User
- UserId
- ProfileId
Profile
- ProfileId
- {unimportant profile details}
- ModifiedOn
- CreatedOn
在每个表中,Id 是它们的主键。问题是两个表之间有 3 个外键关系。
- 用户具有配置文件(User.FK_User_Profile User.ProfileId == Profile.ProfileId(
- 配置文件由用户创建 (Profile.FK_UserCreatedBy 配置文件创建者 == 用户.用户 ID(
- 配置文件由用户修改(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 属性命名,并使用表示用户具有配置文件关系的属性命名,该关系不应是集合