如何指示 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 个外键关系。
- 一个用户有一个配置文件 (User.FK_User_Profile User.ProfileId == Profile.ProfileId)
- 配置文件由用户创建(Profile.FK_UserCreatedBy Profile.CreatedBy == User.UserId)
- 配置文件已被用户修改(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 属性命名并使用表示用户具有个人资料关系的那个,这不应该是一个集合
我有一个 entity framework 设置,它是使用数据库优先方法生成的。在其中我有一个用户 table 和一个配置文件 table.
User
- UserId
- ProfileId
Profile
- ProfileId
- {unimportant profile details}
- ModifiedOn
- CreatedOn
在每个 table 中,ID 是它们的主键。问题是两个 table 之间有 3 个外键关系。
- 一个用户有一个配置文件 (User.FK_User_Profile User.ProfileId == Profile.ProfileId)
- 配置文件由用户创建(Profile.FK_UserCreatedBy Profile.CreatedBy == User.UserId)
- 配置文件已被用户修改(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 属性命名并使用表示用户具有个人资料关系的那个,这不应该是一个集合