我有两种模式:
public class User
{
public int Id { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public Role Role { get; set; }
public int RoleId { get; set; }
}
public class Role
{
public int Id { get; set; }
public string Name { get; set; }
}
引起你的注意用户类包含:
public Role Role { get; set; }
如果我使用此代码:
User user = db.Users.Include(u => u.Role).FirstOrDefault(u => u.UserID == model.UserId);
工作正常,使用User
返回Role
。
然后我检查EF生成的SQL查询,它看起来像这样:
@UserID int
AS
SELECT
[Limit1].[Id] AS [Id],
[Limit1].[Email] AS [Email],
[Limit1].[Password] AS [Password],
[Limit1].[RoleId] AS [RoleId],
[Limit1].[Id1] AS [Id1],
[Limit1].[Name] AS [Name]
FROM
(SELECT TOP (1)
[Extent1].[Id] AS [Id],
[Extent1].[Email] AS [Email],
[Extent1].[Password] AS [Password],
[Extent1].[RoleId] AS [RoleId],
[Extent2].[Id] AS [Id1],
[Extent2].[Name] AS [Name]
FROM
[dbo].[Users] AS [Extent1]
INNER JOIN
[dbo].[Roles] AS [Extent2] ON [Extent1].[RoleId] = [Extent2].[Id]
WHERE
[Extent1].[UserID] = @UserID) AS [Limit1]
END
我复制了这个SQL并创建了一个存储过程,在SQL Server Management Studio中进行测试,它运行得很好。
然后我使用我的存储过程,C#代码:
SqlParameter param = new SqlParameter("@UserID", UserId);
var U = Database.SqlQuery<User>("User_GetUserWithRole @UserID", param);
然后出现问题,U包含Role = null。为什么呢?
答案 0 :(得分:0)
Database.SqlQuery
不会填充导航属性。
有一个手动解决方法,用于将实体附加到上下文并加载属性。但是,这会导致多个查询返回到数据库,因此不建议这样做。
从记忆中它是这样的:
foreach(var user in U)
{
context.Attach(user);
}