【问题标题】:Stored procedure in Entity Framework doesn't work correctly实体框架中的存储过程无法正常工作
【发布时间】:2016-08-01 18:21:35
【问题描述】:

我有两个模型:

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 并创建了一个存储过程,在 SQL Server Management Studio 中测试,它运行良好。

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

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

然后有一个问题,U包含Role = null。为什么?

【问题讨论】:

  • 使用db.Users.SqlQuery("your procedure").ToList();
  • @techspider .ToList() 没有帮助
  • 不仅仅是ToList()。密切关注它; SqlQueryentity 而不是 Database 上执行
  • 请密切关注我最初提供的建议; entity 并不意味着在你的代码中寻找实体;

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


【解决方案1】:

Database.SqlQuery 不填充导航属性。

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

根据记忆是这样的:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 2013-12-25
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多