实体框架中的存储过程没有;工作不正常

本文关键字:工作 不正常 存储过程 框架 实体 | 更新日期: 2023-09-27 17:59:27

我有两种型号:

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);

它工作正常,返回UserRole

然后我检查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并创建了一个存储过程,在SQLServerManagementStudio中进行了测试,它运行得很好。

然后我使用我的存储过程,C#代码:

SqlParameter param = new SqlParameter("@UserID", UserId);
var U = Database.SqlQuery<User>("User_GetUserWithRole @UserID", param);

然后出现了一个问题,U包含角色=null。为什么?

实体框架中的存储过程没有;工作不正常

Database.SqlQuery不填充导航属性。

对此有一个手动解决方法,即将实体附加到上下文并加载属性。然而,这会导致多个查询返回到DB,因此并不推荐使用。

根据记忆,它是这样的:

foreach(var user in U)
{
    context.Attach(user);
}