首先是实体框架代码,获取外键值

时间:2016-08-02 14:30:35

标签: c# sql entity-framework

假设我们有一个包含此实体的项目:

class User
{
    public Guid Id { get; set; }
    public List<Message> Messages { get; set; }
    ...
}

class Message
{
    public Guid Id { get; set; }
    public string Message { get; set; }
}

现在考虑一下我想获取某个用户发布的所有消息的场景,如何在不拉动用户信息的情况下实现此目的呢? (不使用context.Users.Include(...))? 我知道实体框架在Message表中创建了一个列,其中包含发布此消息的用户的Id,但是如何才能访问此值?因为它不是我原来班级的财产。

2 个答案:

答案 0 :(得分:2)

您可以将导航属性添加到Message类:

public class Message
{
    public Guid Id { get; set; }
    public string Message { get; set; }

    public virtual User User { get; set; }
}

然后查询您的上下文:

var userMessages = context.Messages
    .Where(m => m.User.Id == 5);

这是更简洁的方法。或者,您可以从用户开始,但这有点尴尬:

var userMessages = context.Users
    .Where(u => u.Id == 5)
    .SelectMany(u => u.Messages);

这两种方法最终都会生成类似的SQL,如下所示:

SELECT [Extent1].[Column1],
       [Extent1].[Column2],
       [Extent1].[Column3]
FROM [dbo].[Messages] AS [Extent1] 
WHERE 5 = [Extent1].[UserId]

答案 1 :(得分:1)

您可以明确定义FK,这样您就不必解析用户对象。

class Message
{
    public Guid Id { get; set; }
    public string Message { get; set; }

    public int UserID { get; set; }
    [ForeignKey("UserID")]
    public virtual User User { get; set; }
}

然后在需要时对用户进行操作,但如果您只想通过UserID拉取或更改用户ID,则可以这样做。