实体框架中的存储过程无法正常工作

时间:2016-08-01 18:21:36

标签: c# sql-server entity-framework stored-procedures

我有两种模式:

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。为什么呢?

1 个答案:

答案 0 :(得分:0)

Database.SqlQuery不会填充导航属性。

有一个手动解决方法,用于将实体附加到上下文并加载属性。但是,这会导致多个查询返回到数据库,因此不建议这样做。

从记忆中它是这样的:

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